STM32+IAR+UCOS下的中断问题
先说说,几个关键函数:bsp_int.c提供几个关键的中断操作函数:
voidBSP_IntDis (CPU_DATAint_id) //关闭指定中断
voidBSP_IntDisAll (void) //关闭所有中断
voidBSP_IntEn (CPU_DATAint_id) //使能指定中断
voidBSP_IntVectSet (CPU_DATA int_id,
CPU_FNCT_VOIDisr)//用这个函数把用户编写的中断函数的首地址放在中断入口处.
中断发生后,系统调用用户中断函数.
voidBSP_IntPrioSet(CPU_DATA int_id,
CPU_INT08Uprio) //设置中断优先级
实例说明如何用上面的函数:
在app_vect-v5.c中编写串口1中断服务函数:static voidBSP_IntHandlerUSART1 (void)
执行以下三个函数完成串口1中断配置:
BSP_IntVectSet(BSP_INT_ID_USART1, BSP_IntHandlerUSART1);
BSP_IntPrioSet(BSP_INT_ID_USART1,1);
BSP_IntEn(BSP_INT_ID_USART1);
使用uC/OS编写中断函数和使用STM32硬件函数库编写中断函数是不同的,个人推荐使用uC/OS提供的函数编写中断。
---------------------------------------------------------------------------------------------------------------
以上是网友对这个的解释,
而我对这个BSP_IntHandlerUSART1不理解,这个函数是要用作者移植好的中断入口函数,还是要自己定义,网友指的是入口,
但我在调试程序的时候,外部中断和RTC中断都是自己定义的,都可以用,
而串口中断部分,发送可以发送,但是就是进入不了串口中断函数?
问下这个函数是自己定义还是用中断入口函数?还有串口你们碰到这个问题吗?
有用过的,或者知道原理的能否给解释下。 个人愚见,我的例程里不用ucos的中断设置和中断服务,反而用st的库比较方便,就像你的外部中断和RTC中断能正常工作一样!
当然中断的入口肯定是重要的,简单来说必须把你的中断服务程序挂到中断向量表里去,例如下面:
BSP_IntHandlerUSART1, /* 53, INTISR[ 37]USART1 Global Interrupt. */
我的在app_vect_v5.c文件中,你的中断服务程序至少要和向量表里的名称一样,或者把这个名字换成你自己的都行,
还有要把BSP_int.c文件中同名的函数定义注释掉,不然会冲突!你无法进usart中断也可能是这个问题!
当然,要能够进中断还有很多地方需要设置,比如开放中断、设置级别、允许中断等等,
在ucos中重要的地方是一定让SysTick为最高优先级,PendSV为最低即可!
其他的资源中断安排在之间就好!
不知这样说明白了没有? 究其矛盾的原因有2个,
一个是因为网上的网友说用中断入口函数,
二是我看原作者的UC/PROBE里面是自己定义的,所以自己在调试的时候产生矛盾,
现在我用到的是RTC中断,外部中断,串口接收中断,
都是用自己定义的,今天调试了下,是由于USART_ITConfig( USART1, USART_IT_RXNE, ENABLE )没开起,
导致只能发送,接收时进不了接收中断。
----------------------------------------------------------------------------------------------
现在遇到新的问题,就是
RTC中断,外部中断,串口接收中断
优先级别分别为,6,5,4,
开机正常,为什么外部中断一来,就死机了呢 同问,我现在也是遇到串口接收中断就死,郁闷中 回复【楼主位】mcu520
-----------------------------------------------------------------------
BSP_IntHandlerUSART1不理解
=>不对啊,应该是USART1_IRQHandler()要与启动文件里面 的中断入口地址名 相同。
但我在调试程序的时候,外部中断和RTC中断都是自己定义的,都可以用,
=>你这个中断 没有受系统管理吧。 这个确实比较权威,解释的比较详细…… 不错不错
页:
[1]