单片机型号:STM32F070F6P6
今天,在程序框架中增加了Timer16定时器驱动,但程序不能正常运行,本篇日志记录其原因。
驱动程序框架,定义了回调函数Timer16_InterruptFunction,写在main.cpp中用于逻辑层设计。Timer16_InterruptFunction调用的间隔为1ms,具体程序如下:
void Timer16_InterruptFunction(void)
{
Target.HAL.L2.Turn();
}
此程序完成以1ms为间隔L2闪烁的程序,但是将此程序烧写到目标板后,程序不能正常运行。经过调试,最后将问题锁定在启动顺序上,看一下程序外设的启动顺序,具体程序如下:
class CHAL
{
public:
CSystemInit SystemInit;
CSystemClock SystemClock;
CSystemTimer16 SystemTimer16;
CL1 L1;
CL2 L2;
CInfraredEmission InfraredEmission;
};
程序先启动的Timer16,后启动的L2,由于TImer16启动后,立刻发生中断,则会执行Timer16_InterruptFunction中的程序,而此时L2还未初始化,则造成错误发生。
知道以上原因后,解决方法很简单,调换一下启动顺序即可,程序如下:
class CHAL
{
public:
CSystemInit SystemInit;
CSystemClock SystemClock;
CL1 L1;
CL2 L2;
CSystemTimer16 SystemTimer16;
CInfraredEmission InfraredEmission;
};
此时,再运行程序,一切正常。
关键字:STM32 外设启动 先后次序
引用地址:
STM32开发笔记69: 外设启动的先后次序
推荐阅读最新更新时间:2024-11-03 06:33
STM32单片机可以用来做什么?能实现哪些功能?
已从事单片机开发十几年,刚开始接触单片机时,感觉挺有意思。 可以用自己的思维写程序,控制硬件去实现一些智能化的操作。 刚点亮第一个LED,就开始幻想以后能做任何自己想要的产品,那感觉多爽! 但是你会发现学完51单片机、或者STM32单片机以后,还是啥也做不出来。 不是你比较倒霉,每个工程师都是这样过来的。 就像你想写出一篇好作文,光练字和学成语是没用的,你得有思维,有经历。 做产品也是一样,单片机就是工具,思维才是灵魂。 思维怎么来? 答案肯定是多做项目。 所以,想成为一个具备独立开发的工程师,学习单片机只是你成长过程的 冰山一角 。 大部分的时间,应该用来做项目,从简单到复杂。 项目数量决定成长速度,项目质量决定成长高度。
[单片机]
stm32学习之九
USART之实时显示电压值: 主要是adc.h和adc.c文件的编写(实验的时候写成了add.h和add.c) 调试一上午,出现一个不知道怎么搞的,时钟调错了,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE); 调成了APB1,因此只能出现0v等。为戒为戒!!! add.h代码如下: #ifndef _ADD_H #define _ADD_H #include stm32f10x.h void ADC_Configure(); #endif add.c代码如下: #include add.h #define ADC1
[单片机]
基于 STM32 的硬件 I2C 读取 MPU6050 数据
MPU6050其实就是一个 I2C 器件,里面有很多寄存器(但是我们用到的只有几个),我们通过读写寄存器来操作这个芯片。所以首要问题就是 STM32 和 MPU6050 的 I2C 通信。 1、配置 STM32 (用I2C1:PB6——SCL;PB7——SDA) 1)时钟 RCC RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE); 2)GPIO 配置 GPIO_InitStructure.GPIO_Pin = GPIO
[单片机]
STM32 按键扫描方式 使用ST3.0.0库
用到GPIO的操作模式 ======================================================================================== GPIO置1操作: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例如: GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); 这个函数是对一组端口的一些位置1,对PC3 PC4 PC53个引脚一起置1。GPIO_SetBits的作用是对一个端口16个引脚一起赋值。 例如:端口 GPIOC端
[单片机]
stm32专题三十三:RTC实时时钟
RTC功能描述 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟; 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问; 为什么时间不能超过1秒?
[单片机]
STM32单片机常用库函数
1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_标号|GPIO_Pin_标号; //管脚位置定义,标号可以是NONE、ALL、0至15。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速度为50MHz GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(GPIOC,&GPIO_I
[单片机]
基于STM32的红外测温仪的设计与实现
红外测温仪是一种将红外技术与微电子技术相结合的新型温度测量仪器。与传统接触式测温仪器相比,具有测温精度高、非接触、不影响被测对象温度场、响应速度快及稳定性好等一系列优点,在电力、石油、化工、医疗等领域得到广泛应用 。 热释电红外测温仪是利用热释电效应工作的一种新型红外测温仪。与其他传统测温仪相比,具有不需制冷、能在室温下工作和光谱响应宽等优点,且其灵敏度高、响应速度快、抗干扰能力强 。本文利用热释电探测器,结合32 bit ARM核处理器低功耗、高性能和低成本的优点,设计了一个以ARM微控制器STM32为核心的红外测温仪。 1 红外测温的原理 一切温度高于绝对零度的物体都在不停地向周围空间发出红外辐射能量,其辐射能量的大小及其波
[单片机]
iar下的stm32启动代码分析
使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5 设置头文件查找路径,例如: $PROJ_DIR$.. $PROJ_DIR$......LibrariesCMSISCM3CoreSupport $PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x $PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc 预定义的symbol 为,HD为high desity 的意思 USE_STDPERIPH_DRIVER STM32F10X_HD 有两个符号是系统默认的,看名字就应该知道什么了
[单片机]