我在用STM8S003F3测试串口中断发送时,按照以前操作DSP28335的思路,要先发送一个字节的数据,才能够触发发送中断,然后数组中的数据随之发送完。
下面是发送函数和中断函数:
void UartTxData(void)
{
/* Enable UART1 IT */
UART1->CR2 |= 0x80;
/* UART1 send data (8bits) */
UART1->DR = (au8UartTx[0]);
}
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
u8TxPos++;
/* UART1 send data (8bits) */
UART1->DR = (au8UartTx[u8TxPos]);
if(u8TxPos> 8)
{
u8TxPos=0;
/* Disable UART1 IT */
UART1->CR2 &= (uint8_t)(0x7f);
}
}
按理说当我调用一次发送函数时,我定义的数组就会跟着全部发送完,但是结果却少发了一个字节。少发的字节恰好是首字节,经过一番搜查,我发现了这个
串口中断方式发送过程
在硬件层面:如果是电平触发的中断,在中断式发送函数中会使能相应的中断,因为发送缓冲区为空,其所处的电平状态就在中断功能被使能后会直接触发中断,导致第一个字节在中断处理函数中被发送出去;如果是电平跳变触发的中断,为了引发中断,只好把第一个字节在中断式发送函数中“手动”发送出去,由此引发一个中断的“多米诺”效应,把后面的字节依次发送出去。
也就是说只要我使能了发送中断,那么就会马上跳入中断函数,所以首字节没能发送出去。
为了进一步验证不是其他原因造成的,我去翻看数据手册看到中断触发方式是由外部中断控制寄存器来配置的
然后我去查看外部中断控制寄存器在默认情况下是如何配置的,结果就是下降沿和低电平触发方式,这也就验证了参考链接所说。
stm8s_exti.c文件:
void EXTI_DeInit(void)
{
EXTI->CR1 = EXTI_CR1_RESET_VALUE;
EXTI->CR2 = EXTI_CR2_RESET_VALUE;
}
stm8s.h文件:
#define EXTI_CR1_RESET_VALUE ((uint8_t)0x00)
#define EXTI_CR2_RESET_VALUE ((uint8_t)0x00)
设计资源 培训 开发板 精华推荐
- 使用 Microchip Technology 的 LM385BCZB-1.2 的参考设计
- FRDM-K22F: 面向Kinetis® K22 MCU的恩智浦Freedom开发平台
- LTM4620EV 1.5V @ 26A、具有温度监控功能的两相设计的典型应用电路
- 使用 Silicon Labs 的 SI3400 的参考设计
- A6261 混合输出组合 LED 阵列驱动器的典型应用
- ADR291GRUZ 2.5V便携式设备稳压器典型应用电路
- LTC2931IF、12V、5V、3.3V、2.5V、1.8V、1.2V六电源监视器的典型应用电路
- 使用 Microchip Technology 的 MH88615 的参考设计
- 基于SR1PAAU的输入/输出不同电压域中SR1xxxU器件的典型应用电路
- OP484FPZ 高端负载电流监控器的典型应用
- 亚信电子推出最新EtherCAT从站双核微控制器解决方案
- 消息称英特尔Meteor Lake 核显采用台积电 3nm 工艺
- M系列芯12吋Macbook新品遭曝光:放大版iPhone 13
- 小米高管解读财报:缺芯使小米手机减产超1000万部
- 手术机器人康诺思腾完成5亿元B轮融资
- 早期测试显示超瓷晶面板让iPhone 12耐用性与耐刮性显著提高
- PlayStation 5的DualSense手柄兼容安卓与Windows设备
- iPhone 12/12 Pro拆解显示:屏幕与电池组件可互换
- iPhone 12 Pro机型支持用LiDAR扫描仪来测量身高
- iPhone 11/12同时浸9米水下20分钟:猜猜结果