程序跑飞原因总结 && 引脚配置&&中断&&while循环&&数组越界 &&硬件原因

本文总结了项目开发中遇到的技术挑战,包括引脚配置错误、中断使用不当、while循环的超时处理、数组越界和硬件问题。重点介绍了如何在FreeRTOS中正确处理中断、优化循环结构和防止数组溢出,以提升程序稳定性和效率。

2023.11月开始做了新项目,技术不到家导致程序多次跑飞,现在总结如下

一、引脚配置错误

错误原因同一个引脚初始化两次

1.硬件原理图变更,引脚功能变动,改动时不仔细

2.代码规范不好:对于引脚的宏定义封装不好,除了.h文件还在其他地方出现数字引脚

错误现象:

1.程序跑飞

2.调试时将新增引脚初始化挪动位置程序就会正常:原因时挪动位置后初始化正确了

解决办法:

1.做好引脚定义的宏封装,避免在.c文件里还出现数字引脚,如pin3,一律在.h文件中就封装完成



二、中断的使用

开发过程中需要使用一个新得芯片,芯片要求在数据传输时使用CPU级得中断

错误原因:误用不属于freertos的CPU中断

 __get_PRIMASK();
__set_PRIMASK(cpu_key);

错误现象:一旦芯片开始数据传输调用到该中断,程

以下为你总结一些移远通信可能涉及的关于STM32的面试题及答案: ### 基础概念类 #### 1. 简述STM32系列微控制器的特点 STM32系列微控制器基于ARM Cortex-M内核,具有高性能、低功耗、丰富的外设接口等特点。它集成了多种通信接口,如SPI、I2C、UART等,可方便地与外部设备进行通信。其具有较大的存储容量,能满足不同应用场景的数据存储需求。此外,还具备丰富的定时器资源,可用于精确的定时控制。 #### 2. 解释STM32的时钟系统 STM32的时钟系统较为复杂,主要由内部时钟源(如HSI、LSI)和外部时钟源(如HSE、LSE)组成。HSI是内部高速时钟,可作为系统时钟的来源;HSE是外部高速时钟,精度较高。时钟信号经过PLL(锁相环)进行倍频或分频处理,以满足不同外设对时钟频率的要求。通过合理配置时钟系统,可以在满足系统性能需求的同时,降低功耗。 ### 编程操作类 #### 1. 如何在STM32上实现一个简单的GPIO输出? 以下是使用标准库在STM32上实现简单GPIO输出的示例代码: ```c #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIO端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIO引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { GPIO_Configuration(); while (1) { // 输出高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 延时 for (int i = 0; i < 1000000; i++); // 输出低电平 GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 延时 for (int i = 0; i < 1000000; i++); } } ``` #### 2. 怎样使用STM32的定时器实现定时功能? 以下是使用TIM3定时器实现1秒定时的示例代码: ```c #include "stm32f10x.h" void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置TIM3 TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 使能TIM3中断 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能TIM3 TIM_Cmd(TIM3, ENABLE); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // 处理定时事件 // 这里可以添加具体的处理代码 // 清除中断标志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } int main(void) { TIM3_Configuration(); NVIC_Configuration(); while (1) { // 主循环 } } ``` ### 问题调试类 #### 1. 当STM32程序时,可能的原因有哪些? 程序可能是由多种原因导致的。硬件方面,电源不稳定、时钟信号异常、引脚短路等都可能影响程序的正常运行。软件方面,数组越界、指针错误、中断处理不当等会破坏程序的执行流程。此外,外部干扰,如电磁干扰,也可能使程序出现异常。 #### 2. 如何调试STM32程序? 可以使用调试工具,如JTAG、SWD等接口连接开发板和调试器。通过调试器可以单步执行程序、设置断点、查看变量值等。还可以使用串口打印调试信息,将关键变量的值或程序执行的状态信息通过串口发送到上位机,方便分析程序的运行情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值