完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
求助:使用STM8S207R8单片机,寄存器操作,没有使用库函数,使用PA1,PA2做模拟串口,PA1----TX,PA2-----RX,定时器4做模拟波特率定时104us,模拟波特率9600,发送数据正常,接收采用中断开启的方式,当数据起始位来临时,进入外部中断,并关闭外部中断,开启定时器,初始化定时器重装载值,按位接收数据,目前问题出现在外部中断关闭时,没有关闭成功,导致数据接收失败,代码片段如下:
外部中断: @far @interrupt void EXti_PA2_TLI(void) // { debug ++; GPIOA -> CR1 |= (1<<2);//中断上拉 GPIOA -> CR2 = ~(1<<2);//关中断 receive_flag = 1; TIM4 -> CNTR =0x67; TIM4 -> IER = 0x01; } 定时器4中断: @far @interrupt void TIM4_UPD_OVF_IRQHandler (void)//104US { TIM4 -> SR1 = 0x00; if(receive_flag == 1) { uartn_rx_data = uartn_rx_data >> 1; if(read_RXD) { uartn_rx_data |= 0x80; } uartn_rx_bit++; if(uartn_rx_bit > 7) { uartn_rx_bit = 0; receive_flag = 0; uartn_receive_buff[uartn_rx_length] = uartn_rx_data; uartn_rx_data = 0; uartn_rx_length ++; GPIOA -> CR2 |= (1<<2);//开中断 TIM4 -> IER = 0x00; // 禁止中断 TIM4->CNTR=0; if(uartn_rx_length >= 64) { //memset(uartn_receive_buff,0,64); uartn_rx_length = 0; } } } else if(send_flag == 1) { if(Uartn_cont==0) { GPIOA -> ODR = ~(1<<1); } else { if((Uartn_data 0x01)==0x01) { GPIOA -> ODR |= (1<<1); } else { GPIOA -> ODR = ~(1<<1); } Uartn_data>>=1; } Uartn_cont++; if(Uartn_cont>9) { Uartn_cont=0; send_flag = 0; TIM4 -> IER = 0x00; // 禁止中断 TIM4->CNTR=0; GPIOA -> ODR |= (1<<1); } } } 使用库函数写的103的小程序可以正常运行 void tim4IRQ(void) { TIM4_ClearITPendingBit(TIM4_IT_UPDATE); debug ++; if(receive_flag == 1) { uartn_rx_data = uartn_rx_data >> 1; if(0 != GPIO_ReadInputPin(GPIOA, GPIO_PIN_2)) { uartn_rx_data |= 0x80; } uartn_rx_bit++; if(uartn_rx_bit > 7) { uartn_rx_bit = 0; receive_flag = 0; uartn_receive_buff[uartn_rx_length] = uartn_rx_data; uartn_rx_data = 0; uartn_rx_length ++; GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT); TIM4_Cmd(DISABLE); TIM4->CNTR=0; if(uartn_rx_length >= 64) { memset(uartn_receive_buff,0,64); uartn_rx_length = 0; } } } else if(send_flag == 1) { if(Uartn_cont==0) { GPIOA -> ODR = ~(1<<1); } else { if((Uartn_data 0x01)==0x01) { GPIOA -> ODR |= (1<<1); } else { GPIOA -> ODR = ~(1<<1); } Uartn_data>>=1; } Uartn_cont++; if(Uartn_cont>9) { Uartn_cont=0; send_flag = 0; TIM4_Cmd(DISABLE); TIM4->CNTR=0; GPIOA -> ODR |= (1<<1); } } } [/td] 以下内容为评论 [td]我使用库函数写的小程序就可以正常运行代码如下: void GpioAIRQ(void) { debug2 ++; debug3 = 0; GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT);//关中断 receive_flag = 1; TIM4_SetCounter(0x67); TIM4_Cmd(ENABLE);//启动定时器 TIM4_Cmd(ENABLE);//启动定时器 } void tim4IRQ(void) { TIM4_ClearITPendingBit(TIM4_IT_UPDATE); debug ++; if(receive_flag == 1) { uartn_rx_data = uartn_rx_data >> 1; if(0 != GPIO_ReadInputPin(GPIOA, GPIO_PIN_2)) { uartn_rx_data |= 0x80; } uartn_rx_bit++; if(uartn_rx_bit > 7) { uartn_rx_bit = 0; receive_flag = 0; uartn_receive_buff[uartn_rx_length] = uartn_rx_data; uartn_rx_data = 0; uartn_rx_length ++; GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT); TIM4_Cmd(DISABLE); TIM4->CNTR=0; if(uartn_rx_length >= 64) { memset(uartn_receive_buff,0,64); uartn_rx_length = 0; } } } else if(send_flag == 1) { if(Uartn_cont==0) { GPIOA -> ODR = ~(1<<1); } else { if((Uartn_data 0x01)==0x01) { GPIOA -> ODR |= (1<<1); } else { GPIOA -> ODR = ~(1<<1); } Uartn_data>>=1; } Uartn_cont++; if(Uartn_cont>9) { Uartn_cont=0; send_flag = 0; TIM4_Cmd(DISABLE); TIM4->CNTR=0; GPIOA -> ODR |= (1<<1); } } } |
|
相关推荐
2个回答
|
|
对比一下库函数看看吧。 我看库函数是先关中断,然后再设置IO其他模式
|
|
|
|
要关闭外部中断,需要对外部中断寄存器进行相应的配置。在STM8S207R8上,使用EXTI_CR1寄存器来配置外部中断的相关设置。根据你的代码片段,假设你想关闭PA2引脚的外部中断,可以在EXTI_CR1寄存器中将相应的位(EXTI1_PE)清除。
代码示例: ```c // 关闭PA2引脚的外部中断 EXTI->CR1 &= ~EXTI_CR1_EXTI1_PE; ``` 注意,EXTI_CR1_EXTI1_PE是一个宏定义,表示PA2引脚的外部中断使能位。 此外,还要确保你的代码没有其他地方再次设置或打开了该中断位。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1645 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1564 浏览 1 评论
992 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1610 浏览 2 评论
1871浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
656浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
526浏览 3评论
542浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
515浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 01:52 , Processed in 0.888300 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号