打印

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

[复制链接]
3435|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangzh198|  楼主 | 2013-3-24 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 huangzh198 于 2013-3-24 00:04 编辑
void USART_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

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


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

沙发
huangzh198|  楼主 | 2013-3-24 00:58 | 只看该作者
我用自己写的代码

void USART_Config(void)
{
        USART_InitTypeDef         USART_InitStructure;
        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;    //uart模式
  USART_Init(USART1, &USART_InitStructure); //这个是真正的初始化,把上面的配置写到寄存器中
  USART_Cmd(USART1, ENABLE);//时能UART1
}
这个时候却不会进入HardFault,不过还是串口通信没实现

使用特权

评论回复
板凳
huangzh198|  楼主 | 2013-3-25 21:19 | 只看该作者
本帖最后由 huangzh198 于 2013-3-25 21:20 编辑
 /* GPIO初始化:GPIOA:PA9用于USART1_Tx;PA10用于USART1_Rx */        
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//PA9-USART1_Tx
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//PA10-USART1_Rx
终于知道为什么一直不成功了。原来是GPIO的复用功能没开启,在GPIO设置那里添加上这两句就可以了。
完整代码如下



void USART_GPIOInit(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        /* GPIO初始化:GPIOA:PA9用于USART1_Tx;PA10用于USART1_Rx */       
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//PA9-USART1_Tx
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//PA10-USART1_Rx
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                       
}

void USART_Config(void)
{
        USART_InitTypeDef         USART_InitStructure;
        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;    //uart模式
  USART_Init(USART1, &USART_InitStructure); //这个是真正的初始化,把上面的配置写到寄存器中
  USART_Cmd(USART1, ENABLE);//时能UART1
//        USART_ClearFlag(USART1, USART_FLAG_TC);
//↑清除发送标志。这个是在看视频的时候人家说解决第一个字节不正确的问题。在我的板子上发现没这个也可以正确输出一个字符
}


使用特权

评论回复
地板
gaupen1186| | 2013-3-25 21:57 | 只看该作者
GPIO的复用功能,GPIO的时钟,这是新手最常见最容易犯的错误。去年我也犯过。不过,犯过一次,你就不会第二次了。因为每每想起来,都觉得这种错误好丢人。

使用特权

评论回复
5
huangzh198|  楼主 | 2013-3-26 23:27 | 只看该作者
gaupen1186 发表于 2013-3-25 21:57
GPIO的复用功能,GPIO的时钟,这是新手最常见最容易犯的错误。去年我也犯过。不过,犯过一次,你就不会第二 ...

发现网上的程序大多都是F1系列的,F0系列的几乎看不到。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

22

帖子

0

粉丝