OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5139|回复: 14

USART程序停在HardFault_Handler

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
发表于 2014-12-31 20:49:48 | 显示全部楼层 |阅读模式
5金钱

程序一直停在void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
下面是一个很很基本的程序
#include"stm32f10x.h"

void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
  USART_ClockInitTypeDef USART_ClockInitStructure;
   
    /* 
    * 波特率为38400bps
    * 8位数据长度
    * 1个停止位,无校验
    * 禁用硬件流控制
    * 禁止USART时钟
    * 时钟极性低
    * 在第2个边沿捕获数据
    * 最后一位数据的时钟脉冲不从 SCLK 输出
    */
 USART_DeInit(USART1);
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
  USART_Init(USART1, &USART_InitStructure);
   
    /* 使能USART3 */
    USART_Cmd(USART1 , ENABLE);
}
void RCC_Configuration(void)
{
    /* 定义枚举类型变量 HSEStartUpStatus */
    ErrorStatus HSEStartUpStatus;
   
    /* 复位系统时钟设置*/
    RCC_DeInit();
    /* 开启HSE*/
    RCC_HSEConfig(RCC_HSE_ON);
    /* 等待HSE起振并稳定*/
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    /* 判断HSE起是否振成功,是则进入if()内部 */
    if(HSEStartUpStatus == SUCCESS)
    {
     /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
     /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
     RCC_PCLK2Config(RCC_HCLK_Div1);
     /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
     RCC_PCLK1Config(RCC_HCLK_Div2);
     /* 设置FLASH延时周期数为2 */
     FLASH_SetLatency(FLASH_Latency_2);//FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。
     /* 使能FLASH预取缓存 */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启FLASH预读缓冲功能,加速FLASH的读取
     /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz*/
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
     /* 使能PLL */
     RCC_PLLCmd(ENABLE);
     /* 等待PLL输出稳定 */
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     /* 选择SYSCLK时钟源为PLL */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成为SYSCLK时钟源 */
     while(RCC_GetSYSCLKSource() != 0x08);
    }  
    /* 开启USART1和GPIOA,GPIOB,GPIOC,GPIOD时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);  //使能GPIOA,B,C,D时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                                            //使能功能复用IO时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);                        //使能TIM2,TIM3,TIM4时钟
}
void GPIO_Configuration(void)
{
    /* 定义 GPIO 初始化结构体 GPIO_InitStructure */
    GPIO_InitTypeDef GPIO_InitStructure;
   
    /* 设置GPIOA的PA0~PA3(TIM2 CH1~CH4),PA6~PA7(TIM3 CH1~CH2),PA9(UART1 TX)为第二功能推挽输出模式 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB , &GPIO_InitStructure);
 
  /* 设置GPIOA的PA10(UART1 RX)为第二功能浮空输入模式 */
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  GPIO_ResetBits(GPIOA,GPIO_Pin_9);
}
int main(void)
{
int i;
u8 data[]="HELLOHI";
for(i=1;i<8;i++)
{
      USART_SendData(USART1, data);    //send
}
}
求助为什么会出现这种情况啊

最佳答案

查看完整内容[请看2#楼]

参考下我们的例程。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-31 20:49:49 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-31 22:23:26 | 显示全部楼层
这种错误,往往是内核发生的错误,貌似与USART无关。
比如有管脚没通电,总线发生冲突,等等。
你可以做个假程序试验一下。

另外,主程序没有见到系统的初始化,USART的初始化,已经等待发送完成的内容。
看来LZ是新手。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 09:27:25 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
连新手都不算啦,小白一枚,原来有等待发送的,后来我以为可能是那的问题就删了试试看光在软件上运行行不行,可是还不能啊?您所说的系统初始化是?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-1-1 09:53:51 | 显示全部楼层
回复【4楼】单片机逐梦人:
---------------------------------
找个开发板吧,先跑例程,把程序一句一句都搞清楚。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 10:05:15 | 显示全部楼层
回复【3楼】正点原子:
-------------------------
原子哥,你好,为什么我在串口通信实验的例程中没有看到开启时钟的代码呢?
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 10:06:50 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
哦,不是,是那个时钟初始化的代码。。。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 10:07:52 | 显示全部楼层
回复【5楼】xuande:
---------------------------------
请问有没有串口通信库函数的代码?可以发一下吗?我看到原子哥例程中用的是寄存器
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-1-1 10:13:56 | 显示全部楼层
回复【8楼】单片机逐梦人:
---------------------------------
两种版本都有。免费下载。
本论坛里找找,应当有。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 10:34:58 | 显示全部楼层
回复【9楼】xuande:
---------------------------------
你好,我把等待的函数加上以后它就一直在等待,跑不出来,我看了原子哥的例程,就是写的那个V3.5库函数版本的,里面关于USART的不是用的函数,直接对寄存器进行了操作,问一下串口这个实验可以只在软件上模拟吗
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-1 10:48:09 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我看例程了,我觉得,我只是把对寄存器的操作改了一下,但是就不行了啊,我又加了等待但是就一直在等待函数里出不来。。。
int main(void)
{
int i;
u8 data[]="HELLOHI";
GPIO_SetBits(GPIOA,GPIO_Pin_9);
for(i=1;i<7;i++)
{
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
     USART_SendData(USART1, data);    //send
}
}
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-1-1 12:37:12 | 显示全部楼层
先跑例程,对照硬件手册,把程序一句一句都搞清楚。
这句是做什么用,可不可以去掉,都搞明白。

不要浮躁。

依赖别人手把手地教你,基本不可能。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-1 23:01:21 | 显示全部楼层
回复【11楼】单片机逐梦人:
---------------------------------
串口有这么简单么?
多看看我们教程吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-2 19:46:58 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
嗯嗯,谢谢了,我明白了,确实问题好多
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13135
金钱
13135
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-1-2 20:05:35 | 显示全部楼层
看了楼主的程序 

还是先跑个流水灯吧。。。。

硬件都不初始化的 !!
学无止境
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 10:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表