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

来源:互联网 发布:绿色上网软件手机软件 编辑:程序博客网 时间:2024/04/26 17:58

项目型号: 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 的初始化,包括时钟之类的。

 

// 总结,此次卡在 hardfault_handle  主要是 SysteInit这个函数,因为 这个函数会设置MCU 的一些默认参数,如果这个函数没有的话,MCU会进入硬件错误。
*/

#include <stm32f4xx.h>
#include <stm32f4_discovery.h>
// 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');
 }
}

 

 

0 0
原创粉丝点击