stm32 中断中断怎样pending

stm32 EXTI 中断系统
编程步骤_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
stm32 EXTI 中断系统
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢stm32正常模式下的CAN测试程序问题 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
stm32正常模式下的CAN测试程序问题
助理工程师
15:10:30  
我用的stm32F103VC控制器外接一个TJA1050CAN收发器,加一个CAN分析仪(iTEK公司的USBCAN-II)进行测试,stm32的CAN测试程序如下1、采用回环模式,使能CAN接收中断,调试发现,可以进入接收中断,而且接收的数据与发送的数据相同,故自发自收没有问题了,2、将回环模式改为正常模式,stm32发送,分析仪监听,没有监测到数据,而且stm32的错误寄存器指示显性位错误(bit dom error。
CAN初始化及配置程序如下:
void CAN_INIT(void)
& &GPIO_InitTypeDef GPIO_InitS
& &CAN_InitTypeDef& && &&&CAN_InitS
& &CAN_FilterInitTypeDef&&CAN_FilterInitS
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB2Periph_GPIOB, ENABLE);//时钟使能
&&GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);//CAN管脚重映射到PB8-9
&&/* Configure CAN pin: RX =&&PB8 */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
&&GPIO_Init(GPIOB, &GPIO_InitStructure);
&&/* Configure CAN pin: TX =&&PB9 */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
&&GPIO_Init(GPIOB, &GPIO_InitStructure);
&&CAN_DeInit(CAN1);
&&CAN_StructInit(&CAN_InitStructure);
&&/* CAN cell init */
&&CAN_InitStructure.CAN_TTCM=DISABLE;
&&CAN_InitStructure.CAN_ABOM=DISABLE;
&&CAN_InitStructure.CAN_AWUM=DISABLE;
&&CAN_InitStructure.CAN_NART=DISABLE;
&&CAN_InitStructure.CAN_RFLM=DISABLE;
&&CAN_InitStructure.CAN_TXFP=DISABLE;
&&CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;& && && &//CAN_Mode_Normal;//
&&CAN_InitStructure.CAN_SJW=CAN_SJW_1
&&CAN_InitStructure.CAN_BS1=CAN_BS1_8
&&CAN_InitStructure.CAN_BS2=CAN_BS2_7
&&CAN_InitStructure.CAN_Prescaler=18;
&&CAN_Init(CAN1, &CAN_InitStructure);
&&/* CAN filter init */
&&CAN_FilterInitStructure.CAN_FilterNumber=1;
&&CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdM
&&CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32
&&CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
&&CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
&&CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
&&CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
&&CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
&&CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
&&CAN_FilterInit(&CAN_FilterInitStructure);
&&/* CAN FIFO0 message pending interrupt enable */
&&CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
//CAN发送函数
void can_write(uint16_t id, uint8_t *data_buf, uint8_t len)& &
&&/* transmit 1 message */
&&TxMessage.StdId =
&&TxMessage.ExtId = 0x0000;
&&TxMessage.IDE = CAN_ID_STD;
&&TxMessage.RTR = CAN_RTR_DATA;
&&TxMessage.DLC =
&&memcpy(TxMessage.Data, data_buf, len);
&&CAN_Transmit(CAN1, &TxMessage);
CAN中断处理函数
void USB_LP_CAN1_RX0_IRQHandler(void)
& & CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
& & printf(&recv a frame\r\n&);
敢问大神问题出在什么地方?忘指点一二,小弟不胜感激!
助理工程师
16:00:06  
我知道了,上面程序有两处错误:
1).RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB2Periph_GPIOB, ENABLE);应该改为
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
2).RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);& && &//RCC_APB2Periph_AFIO复用时钟不能少;
站长推荐 /3
Powered by> 求助,STM32 TIM2 1ms溢出中断1
管理员:&&&&&人数:6606小组积分:71891简介:欢迎进入STM32小组,学习讨论相关技术、交换资料、交流学习经验和设计心得。QQ群:小组公告福利:免费申请STM32F0308-DISCO开发套件(Discovery kit with STM32F030R8 MCU) 活动马上开始,只需2分钟即可申请。申请地址:&&|&&&&|&&
需要确认注册邮箱后才能下载,
楼主&&[其他]&
求助,STM32 TIM2 1ms溢出中断1
6年会员勋章目前未领取。领取条件:&凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:618分
总积分:1229分
发表于 11:23
各位高手:&& 小弟正在学习STM32 的定时器。感觉功能真的很强大,但是设置也是很麻烦的。我要用TIM2做定时器使用,每1ms产生溢出中断,后然去查询PA.03口的按键是否有按下。编译是正确的的,但是就是不产生中断,下面是设置,亲大家看看,并指点,看问题处在什么地方!谢谢!&RCC时钟也打开了。/*********************************************************RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);&&&&//*********************************************************void NVIC_Configuration(void){& NVIC_InitTypeDef NVIC_InitS&#ifdef& VECT_TAB_RAM& & /* Set the Vector Table base location at 0x */ & NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else& /* VECT_TAB_FLASH& */& /* Set the Vector Table base location at 0x */ & NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);&& #endif/* Configure the NVIC Preemption Priority Bits[配置优先级组] */& & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);& & /* Enable the TIM2 gloabal Interrupt [允许TIM2全局中断]*/& NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQC& NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;& NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;& & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;& NVIC_Init(&NVIC_InitStructure);}&&/*********************************************************void TIM2_Configuration(void){&&& TIM_TimeBaseInitTypeDef TIM_TimeBaseS&TIM_DeInit( TIM2); //复位TIM2定时器&&&& &&& TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;&& // 定时器基准频率32MHz&&& TIM_TimeBaseStructure.TIM_Prescaler = 32000;&&&&&&&&&&&&&&&&&&& // 计数频率为1KHz&&& TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数&&& TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;&&& TIM_TimeBaseStructure.TIM_Period& = 0; // 这个值实际上就是TIMX-&ARR,延时开始时重新设定即可&&& TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);&/* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */&&& TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除上次可能遗留的标志&&& TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 计数溢出时触发中断&& /* TIM2 enable counter [允许tim2计数]*/&&&& TIM_Cmd(TIM2, ENABLE);/********************************************************
夜里人 编辑于 16:16
1楼&&[其他]&
Re:求助,STM32 TIM2 1ms溢出中断1
6年会员勋章目前未领取。领取条件:&凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:165分
总积分:330分
发表于 16:16
最好确认下定时器的时钟输入源,它由TIM2~7的倍频器提供,而这个倍频系数由APB1预分频系数决定。
--- 现有 2个主题,共 1页,目前第 1页 ---&&
点击,立即回复。
EDN China官方微信
扫一扫关注,获取电子新知,设计灵感
IC厂商小组
在线研讨会
赞助商链接
2016 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |查看: 4841|回复: 13
stm8 外部中断反复响应的问题,求教!
本帖最后由 Flynn1986 于
21:09 编辑
最近调试代码碰到一个问题,就是我设置PB.7口作为外部中断,触发方式是仅下降沿。
初始化代码如下:
& & & & & & /*set the priorty of Port B external interrupts*/
& & & & ITC_SetSoftwarePriority(ITC_IRQ_PORTB,ITC_PRIORITYLEVEL_1);
& & & & /* Initialize I/O in Input Mode with Interrupt for PORTB.7 */
& & & & GPIO_Init(GPIOB, (GPIO_Pin_TypeDef)GPIO_PIN_7,GPIO_MODE_IN_PU_IT);
& & & & /* Initialize the Interrupt sensitivity */
& & & & EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);
然后我另一个IO模拟一个下降沿,从高拉到低,用示波器触发,波形正常,
不知为什么中断服务函数总是响应?
那位高手碰过这样的问题,求教!
另外由于实时性的要求,我的中断服务代码是用汇编写的。
f_EXTI_PORTB_IRQHandler:
& && &关闭中断
& && & ;以下就是一些处理代码
& && & ......;
& && & ......;& && &
& && &从新开中断
& && & 中断返回
中断响应函数没清中断标志?
rakcart 发表于
中断响应函数没清中断标志?
好像stm8的外部中断标志是不可见的,手册上也没详细说明。
执行EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY)这个子函数前请关闭总中断,执行完毕再打开,具体如下
& &&&//------------------------------------------------------------
& &&&disableInterrupts(),
& &&&//------------------------------------------------------------
& && && && &/*set the priorty of Port B external interrupts*/
& && &&&ITC_SetSoftwarePriority(ITC_IRQ_PORTB,ITC_PRIORITYLEVEL_1);
& && &&&/* Initialize I/O in Input Mode with Interrupt for PORTB.7 */
& && &&&GPIO_Init(GPIOB, (GPIO_Pin_TypeDef)GPIO_PIN_7,GPIO_MODE_IN_PU_IT);
& && &&&/* Initialize the Interrupt sensitivity */
& && &&&EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);
& && &&&//------------------------------------------------------------
& && &&&enableInterrupts()
& && & //------------------------------------------------------------
zlutian 发表于
执行EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY)这个子函数前请关闭总中断, ...
有做这个的动作了。
Flynn1986 发表于
有做这个的动作了。
我目前用到两个外部中断(PA口一个,PC口一个)表示没问题没压力,其实也很简单的,你首先要确认一下:你进入仿真调试环境,运行完EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);
函数后,查看EXTI-&CR1寄存器此时的值是不是你所希望的值。
应该是要软件清除中断标志的。
蜂巢 发表于
应该是要软件清除中断标志的。
楼上你可能没用过STM8的外部中断吧,STM8外部中断根本就没有标志位的,不信你可仔细详读技术参考后册.
问题已OK,是我大意,在中断内又模拟了一个跳变沿。
zlutian 发表于
楼上你可能没用过STM8的外部中断吧,STM8外部中断根本就没有标志位的,不信你可仔细详读技术参考后册. ...
这个不是外部中断标志吗,而且官方例程的中断里面有清除中断标志:INTERRUPT_HANDLER(EXTI2_IRQHandler, 10)
{
&&/* In order to detect unexpected events during development,
& &&&it is recommended to set a breakpoint on the following instruction.
&&*/
#ifdef USE_STM8L1526_EVAL
&&/* Joystick SEL button is pressed */
&&PressedButton = BUTTON_SEL;
&&/* Cleat Interrupt pending bit */
&&EXTI_ClearITPendingBit(EXTI_IT_Pin2);
#elif defined USE_STM8L1528_EVAL
&&/* Joystick LEFT button is pressed */
&&PressedButton = BUTTON_LEFT;
&&/* Cleat Interrupt pending bit */
&&EXTI_ClearITPendingBit(EXTI_IT_Pin2);
#endif /* USE_STM8L152X_EVAL */
}复制代码我现在也碰到这个问题,发现中断标志清除不了& &EXTI_ClearITPendingBit(EXTI_IT_Pin2);&&导致每一次外部中断触发要进中断2000多次
本帖子中包含更多资源
才可以下载或查看,没有帐号?
shuxmpx123 发表于
这个不是外部中断标志吗,而且官方例程的中断里面有清除中断标志:我现在也碰到这个问题,发现中断标志清 ...
你用的是STM8L系列的吧,STM8S的规格书没有中断标志位的。
本帖最后由 shuxmpx123 于
19:13 编辑
zlutian 发表于
你用的是STM8L系列的吧,STM8S的规格书没有中断标志位的。
是啊,刚才看了STM8S的资料,确实没有中断标志··
L系列的相对于S的外部中断还是有改进的:中断向量可以选整个端口为一个中断入口,也可以选择所有端口的相同位为一个中断入口;
问题已OK,是我大意,在中断内又模拟了一个跳变沿。
楼主已解决,可否具体分享一下,我也碰到类似问题,我的是低电平触发中断,记录触发次数,次数感觉有偏差,暂不明原因,希望楼主分享一下你的具体解决方法
这个不是外部中断标志吗,而且官方例程的中断里面有清除中断标志:我现在也碰到这个问题,发现中断标志清 ...
stm8L有,8S没有
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 stm32 外部中断 的文章

 

随机推荐