STM32F4 串口程序 调试记录 hardfault_handle 问题

项目型号: Proj01_uart
// 从现在起开始使用项目型号,此程序调试通过
/*****************************************************************************
** 使用UART4通信
** TXD = PA0
** RXD = PA1
******************************************************************************
** 乔海权
** 14-04-03
******************************************************************************
** 调试记录
// 第一次失败了都??原因是什么??
// 判断是 GPIO 的模式设置错误,我记得有文档讲的,可是没找到啊??
// 解决办法:官网的设置 都是 GPIO_Mode_AF,试一下吧
// 先去官网下载一个 固件库,通用版本的,找到对应的具体芯片型号就OK. 不过有点卡 啊
// http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140#
// 点击 all
// 第二次失败了,发现程序一直卡在 startup_stm32f4xx.s文件里面的 hardfault_handle 这里,不清楚是怎么回事
// 解决办法:网上提示 stm32f4xx_it.c文件没有,加入之后一直卡在 这个文件的中断处理函数里面,推测是硬件错误
// 第三次失败
// 把对应板子的头文件加进来试试, stm32f4_discovery.h
// 第四次失败,建议检查main.c 文件,是不是没注意到的地方
// 第五次失败,预定义里面添加 STM32F4XX
// 第六次失败,添加 system_stm32f4xx.h 之前遇到的中断可以OK,之所以找到这个文件,是通过对比 之前的例程,发现
// 里面并没有定义 SystemInit 这个函数,原来这个函数在 system_stm324xx.h 这个文件里面已经定义好了。这个函数推测是
// 设置 MCU 的初始化,包括时钟之类的。
【STM32F4 串口程序 调试记录 hardfault_handle 问题】
// 总结,此次卡在 hardfault_handle主要是 SysteInit这个函数,因为 这个函数会设置MCU 的一些默认参数,如果这个函数没有的话,MCU会进入硬件错误。
*/
#include
#include
// GPIO_TypeDef 是 寄存器的数组
//GPIO_TypeDef GPIO_InitStructure; //这行代码是错误的?
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef UART_InitStruct;
// 这个函数 在另外一个文件里面已经定义了
//void SystemInit(void)
//{
//}
void clk_configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
}
// 为什么头文件改不了???
// keil 的 project里面的有些文件是 上面带个钥匙的,所以是锁着的??
// OK, 把文件的属性只读去掉就行,在电脑里面,不是keil
void gpio_configuration(void)
{
// TXD 引脚配置,输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
// 根据官网的写法,应该是 GPIO_Mode_AF
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// RXD 引脚配置,输入, 我记得是有一个手册专门讲那个引脚配置成什么的,
// 为什么找不到了????
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
// 应该是 GPIO_Mode_AF
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
// 如果是输入模式,下面的代码应该是不用的吧。开漏极,或者推挽输出??
// 官网的这句话是有的哈
//GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
// 上拉下拉设置
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
// 其实下面这句话,把结构体 GPIO_InitStruct 的参数写进 GPIOA 里面, GPIOA 是一个GPIO 的寄存器结构体
// 按顺序排列了 GPIO 的所有寄存器
GPIO_Init(GPIOA, &GPIO_InitStruct);

}
void uart4_configuration(void)
{
UART_InitStruct.USART_BaudRate = 9600;
UART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
UART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
UART_InitStruct.USART_Parity = USART_Parity_No;
UART_InitStruct.USART_StopBits = USART_StopBits_1;
UART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(UART4, &UART_InitStruct);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_UART4);

}
void delay(unsigned int j)
{
while(j--);
}
// 根据 PDF文档里面讲的 alternate function mapping ,串口 4 映射到 AF8 里面,我是不是这个函数,
// 没写???
// 问题解决,确实是这个问题。
int main(void)
{
clk_configuration();
gpio_configuration();
uart4_configuration();
USART_Cmd(UART4, ENABLE);
while(1)
{
// 一直卡在下面这句话里面,为什么感觉 USART_IT_TXE 这个不太正确??
//while((USART_GetFlagStatus(UART4, USART_IT_TXE)) == 1);
//while((USART_GetFlagStatus(UART4, USART_FLAG_TXE)) == SET);
delay(10000);
// 下面这个函数居然跳不出来
USART_SendData(UART4, 'A');
}
}


    推荐阅读