完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
中断函数写在stm32f10x_it.c中了,这个文件中包含了各种中断
|
|
|
|
系统发生中断的时候,程序调到中断向量表中对应的位置,中断向量表在starup_stm32f10x.hd.s这个启动文件中有定义。例如Systick系统时钟中断,他找到向量表中Systick中断,这里面就是一个字节的地址,中断就跳到这个地址执行。这个地址就是对应中断函数的入口。而中断函数在stm32f10x_it.c中。你把你中断要处理的程序添加到SysTickHandler(void)这个函数里面就行了。本来这个函数是空的。
|
|
|
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = ticks - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } 请问,这个是从哪一句开始进入中断的呢? 是NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 还是 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */呢??? |
|
|
|
__函数 发表于 2014-12-16 21:46 这个是滴答时钟定时器中SysTick_IRQn。starup_stm32f10x.hd.s文件中会有对应的定时器服务中断函数入口,就是SysTick_Handler这个。 |
|
|
|
我明白了,谢谢。觉得你研究的很深,能否给我解释一下这个问题/** @defgroup RCC_APB1_Peripherals * @{ */ #define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) #define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) #define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) #define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) #define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) #define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) #define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) #define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) #define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100) #define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) #define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) #define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) #define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) #define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) #define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) #define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) #define RCC_APB1Periph_I2C3 ((uint32_t)0x00800000) #define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) #define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) #define RCC_APB1Periph_PWR ((uint32_t)0x10000000) #define RCC_APB1Periph_DAC ((uint32_t)0x20000000) #define RCC_APB1Periph_UART7 ((uint32_t)0x40000000) #define RCC_APB1Periph_UART8 ((uint32_t)0x80000000) #define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00)) /** * @} */ |
|
|
|
我也是大概了解一下库是怎么回事,也没有具体去详细读过,就是大概知道原理而已。(PERIPH) & 0x09013600)这个是取地址,这个地址应该是是RCC_APB1ENR寄存器(不是很确定),这个看stm32参考手册。这句就是读取这个寄存器的值,再转换为PERIPH类型。个人感觉新手还是很难读懂官方的数据手,固件库只要大概了解他怎么实现的就可以了,了解原理。没必要去深入了解他怎样一步步现实的,会用就行了。对它有个总体的认识就可以了。刚开始我也不知道有中断他怎么就进入服务函数了,它怎么没有好像51那样在函数上面标明是中断服务函数,后来深入了解才知道他在启动文件里面定义了服务函数入口。现在我还在学stm32,学到FSMC,SDIO,USB这些,感觉更难了,没有像以前那样有固件库使用手册。本来英文又不好,资料都是英文的。如果你还遇到什么问题可以上来,大家一起探讨一下。希望你可以不像我那样,少走点弯路。 |
|
|
|
我的Q763612411,欢迎交流 |
|
|
|
依然落叶飘零 发表于 2014-12-16 22:10 怎么在定时器中断中做自己人想的事情呢? |
|
|
|
{:12:}{:3:}
|
|
|
|
中断向量表里
|
|
|
|
一言以蔽之,main.c和中断是同时进行的两条线,若检测到中断,即暂停主程序,进入中断服务函数,若能执行完中断服务函数,就跳回到主函数,继续执行main.c
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1049 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1017 浏览 2 评论
2123 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1219 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1639 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 03:10 , Processed in 0.813333 second(s), Total 94, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号