求助!STM32F0DISCOVERY串口初始化时进入HardFault

[复制链接]
 楼主| huangzh198 发表于 2013-3-24 00:01 | 显示全部楼层 |阅读模式
本帖最后由 huangzh198 于 2013-3-24 00:04 编辑
  1. void USART_GPIOInit(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  5. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  8. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);

  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RX
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  13. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  14. GPIO_Init(GPIOA, &GPIO_InitStructure);
  15. }

在main.c里调用的是固件库的函数
串口的初始化如下
  1. USART_GPIOInit();
  2. USART_StructInit(USART_I);
  3. USART_Init(USART1,USART_I);
  4. USART_Cmd(USART1, ENABLE);


程序用MDK可以编译通过,没警告没错误,但是我在仿真的时候发现,每次初始化都是在下面USART_InitStruct->USART_WordLength = USART_WordLength_8b;那句里转去了HardFault,下载到板子上也跑不起来。我是在官方的那个DEMO上添加的代码,.S文件也有的。
这个应该怎样解决呢?
  1. void USART_StructInit(USART_InitTypeDef* USART_InitStruct)
  2. {
  3. /* USART_InitStruct members default value */
  4. USART_InitStruct->USART_BaudRate = 9600;
  5. USART_InitStruct->USART_WordLength = USART_WordLength_8b;
  6. USART_InitStruct->USART_StopBits = USART_StopBits_1;
  7. USART_InitStruct->USART_Parity = USART_Parity_No ;
  8. USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  9. USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  10. }

 楼主| huangzh198 发表于 2013-3-24 00:58 | 显示全部楼层
我用自己写的代码

  1. void USART_Config(void)
  2. {
  3.         USART_InitTypeDef         USART_InitStructure;
  4.         USART_InitStructure.USART_BaudRate=9600;
  5.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  6.         USART_InitStructure.USART_StopBits=USART_StopBits_1;
  7.         USART_InitStructure.USART_Parity=USART_Parity_No;
  8.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  9.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //uart模式
  10.   USART_Init(USART1, &USART_InitStructure); //这个是真正的初始化,把上面的配置写到寄存器中
  11.   USART_Cmd(USART1, ENABLE);//时能UART1
  12. }
这个时候却不会进入HardFault,不过还是串口通信没实现
 楼主| huangzh198 发表于 2013-3-25 21:19 | 显示全部楼层
本帖最后由 huangzh198 于 2013-3-25 21:20 编辑
  1. /* GPIO初始化:GPIOA:PA9用于USART1_Tx;PA10用于USART1_Rx */        
  2.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//PA9-USART1_Tx
  3.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//PA10-USART1_Rx
终于知道为什么一直不成功了。原来是GPIO的复用功能没开启,在GPIO设置那里添加上这两句就可以了。
完整代码如下



  1. void USART_GPIOInit(void)
  2. {
  3.         GPIO_InitTypeDef  GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  6.         /* GPIO初始化:GPIOA:PA9用于USART1_Tx;PA10用于USART1_Rx */       
  7.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//PA9-USART1_Tx
  8.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//PA10-USART1_Rx
  9.        
  10.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  12.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.   GPIO_Init(GPIOA, &GPIO_InitStructure);       
  15.        
  16.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RX
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  18.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.   GPIO_Init(GPIOA, &GPIO_InitStructure);                       
  20. }

  21. void USART_Config(void)
  22. {
  23.         USART_InitTypeDef         USART_InitStructure;
  24.         USART_InitStructure.USART_BaudRate=9600;
  25.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  26.         USART_InitStructure.USART_StopBits=USART_StopBits_1;
  27.         USART_InitStructure.USART_Parity=USART_Parity_No;
  28.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  29.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //uart模式
  30.   USART_Init(USART1, &USART_InitStructure); //这个是真正的初始化,把上面的配置写到寄存器中
  31.   USART_Cmd(USART1, ENABLE);//时能UART1
  32. //        USART_ClearFlag(USART1, USART_FLAG_TC);
  33. //↑清除发送标志。这个是在看视频的时候人家说解决第一个字节不正确的问题。在我的板子上发现没这个也可以正确输出一个字符
  34. }


gaupen1186 发表于 2013-3-25 21:57 | 显示全部楼层
GPIO的复用功能,GPIO的时钟,这是新手最常见最容易犯的错误。去年我也犯过。不过,犯过一次,你就不会第二次了。因为每每想起来,都觉得这种错误好丢人。
 楼主| huangzh198 发表于 2013-3-26 23:27 | 显示全部楼层
gaupen1186 发表于 2013-3-25 21:57
GPIO的复用功能,GPIO的时钟,这是新手最常见最容易犯的错误。去年我也犯过。不过,犯过一次,你就不会第二 ...

发现网上的程序大多都是F1系列的,F0系列的几乎看不到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部