历史上的今天
返回首页

历史上的今天

今天是:2024年12月20日(星期五)

正在发生

2018年12月20日 | STM32F4 串口程序 调试记录 hardfault_handle 问题

2018-12-20 来源:eefocus

项目型号: 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

#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');

 }

}


推荐阅读

史海拾趣

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

为了进一步加速企业的发展,银河微电决定走上上市之路。经过精心筹备和严格审核,公司终于在2021年成功在上交所上市。上市不仅为公司带来了大量的资金支持,还提高了公司的知名度和品牌影响力。借助上市融资的优势,银河微电加大了对研发、生产、销售等各个环节的投入,企业发展步入快车道。

Einfochips公司的发展小趣事

Einfochips公司一直致力于嵌入式系统的创新与发展。在某一时期,该公司推出了Eragon600,一款基于Qualcomm Snapdragon 600处理器的全新嵌入式开发平台。这一平台的推出,标志着Einfochips在嵌入式系统开发领域取得了重要突破。Eragon600不仅具备强大的处理能力,还适用于多种行业,包括工业、安全与监控、信息、娱乐等。在多个领域的广泛应用,进一步巩固了Einfochips在嵌入式系统开发领域的领先地位。

Euroquartz公司的发展小趣事

随着全球电子制造产业的不断发展,Euroquartz也积极拓展国际市场。公司凭借其高品质的产品和专业的技术服务,赢得了全球客户的信赖和支持。如今,Euroquartz的产品已经覆盖全球90多个国家和地区,为全球电子制造产业提供了重要的石英晶振、振荡器、滤波器以及其它频率相关产品。

DCD [Digital Core Design]公司的发展小趣事

DCD公司自创立之初,就专注于数字核心设计领域的研发。创始人们凭借对电子技术的深刻理解和市场需求的敏锐洞察,带领团队攻克了一个又一个技术难关。在产品研发初期,公司面临着资金短缺和技术难题的双重压力,但团队凭借着坚韧不拔的精神,成功研发出了首款具有竞争力的数字核心设计产品,为公司的发展奠定了坚实的基础。

蜂鸟无线公司的发展小趣事
由于PWM调速是通过调整电压脉冲的占空比来控制电动机的平均电压,因此能够减少能量损失,提高系统的能效。
Advance Tapes公司的发展小趣事

随着电子行业的快速发展,对胶带产品的性能要求也越来越高。Advance Tapes公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并与多家高校和研究机构建立了合作关系。经过不懈努力,Advance Tapes成功开发出了一系列具有高性能、高可靠性的胶带产品,得到了广大客户的认可。

问答坊 | AI 解惑

GSM基站的优化建设[推荐]

引用《移动在线》 GSM数字移动通信发展非常迅速,从早期规划的大区制,到后来的小区制,直到现在的微蜂窝、微微蜂窝,相对应的天线从早期架设在屋面铁塔上,到后来天线降到屋面上,直到现在要把天线设置在屋面下的外墙侧面上。所有的这些变化都说 ...…

查看全部问答>

LM3S 系列单片机休眠与深度休眠应用笔记(二)

1.4 深度睡眠模式设置步骤 处理通过调用WFI 指令即可进入睡眠模式,但要进入深度睡眠实现最低的功耗需要正确配置,其步骤如下: 1. 使能ACG 自动时钟门控。这样睡眠模式和深度睡眠模式的外设时钟可以单独控制。 2. 配置寄存器DCGC0、 DCGC1 和DC ...…

查看全部问答>

高分求一源码

哪位哥们有sirf atlasIII的BSP呀?,发一份给我好吗?我的QQ是648433648,邮箱:sunboyljp@163.com,不弟不胜感谢!…

查看全部问答>

wince怎么编译这么慢

我用WINCE60的platform builder去编译一个IMAGE,每次都很慢,。。。。…

查看全部问答>

cadence16.2学习.pdf

很不错的资料 ,希望对大家有所帮助…

查看全部问答>

求教数据存储问题

MSP430F449中我想把一个整形的数A存入某地方 掉电也不丢失! 作为以后程序运行的参数。 应该是放在FLASH里面吧?或者建议是在哪儿? 怎么写和读? 应该读写各一句话就能搞定的吧?不是例子里面那么复杂!! 求给个例子或者指个方向 谢谢 ...…

查看全部问答>

请问广州哪里有零售漆包线、绝缘纸和绝缘漆的地方??

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 请问广州哪里有零售漆包线、绝缘纸和绝缘漆的地方?? 昨天下午走了一下午,传说中有这些东西的解放中,都没看见有卖忘各位朋友指出哪里有得买  …

查看全部问答>

在同一空间如果存在多个ZigBee网络,终端设备如何辨别并加入属于自己的网络?

请斑竹指教,谢谢!   [ 本帖最后由 lvhoujun 于 2011-9-19 22:52 编辑 ]…

查看全部问答>

关于C2000芯片的FLASH锁死----以及解决办法

FLASH锁死了这是为什么,有没有办法解锁。为什么会有类似下面这几种报错: Read status value 0x0001 from symbol PRG_status(24x系列) ADC Calibration not complete, check if device is unlocked and recalibrate.(2833x系列)   答:FL ...…

查看全部问答>

关于施密特触发器的直流信号处理

想问一下各位大侠,施密特触发器对于直流信号是怎么处理的?(我仿真过,发现如果输入一个电压介于两个门限电压之间,那输出电压和输入电压是成比例的,谁能告诉我为什么啊?)…

查看全部问答>