我在用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)
关键字:STM8S003F3 串口 中断发送
引用地址:
STM8S003F3串口中断发送问题
推荐阅读最新更新时间:2024-11-12 11:44
Mega128的串口通讯程序
#i nclude iom128v.h #i nclude macros.h #i nclude uart.h /* USART Buffer Defines */ #define USART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */ #define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 ) #define USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */ #define USART_TX_BUFFER_MASK (
[单片机]
赫优讯netTAP网关实现串口到现场总线的转换
方案描述: netTAP30-DPS的Profibus-DP slave端口连接到DP现场总线网络, RS485引出芯线连接RS485总线上的串口设备(如智能控制仪表、分布式的I/O)。
工作方式: NetTAP30-DPS作为网络上的从站运行:来自主站CPU的协议信息被发送到由netTAP芯线连接的RS485总线上的串口通讯设备,并将接收到的设备响应消息回发至DP主站的I/O映像数据区。 软件组态: SyCON.net软件:协议参数配置、固件下载和诊断;对于不同的串口协议仅仅需要下载相应的固件到netTAP并进行简单的参数配置。 目前,我们可以提供的协议固件
[嵌入式]
轻松搞懂STM32F407串口通信(USART)
串口通信就是一个码元一个码元的发送数据,并行通信就是多个码元同时发送,码元简单来说就是承载信息的信号单位,如二进制码元就通过高低电平来承载信息,那么一个码元就是一个高电平或低电平。 串口基础标准 串口数据帧格式 这张图描述了串口的一个数据帧格式 1:空闲电平为高电平 2:起始信号为下降沿加上一个位的低电平 3:传输数据(通常为八位的,也有些标准定义为其他位数) 4:校验位,这里分为奇偶校验和01校验,当然也可以没有这个位,也就是不需要校验 (1)奇校验:在数据中,1的个数为奇数该位为1,1的个数为偶数则该位为0; (2)偶校验:在数据中,1的个数为偶数该位为1,1的个数为奇数数则该位
[单片机]
AVR串口多机通讯模式的应用
网友提问: AVR的串口说有多机通讯功能,就是在第一帧发送从机的地址,再发数据,呢么请问,从机的地址是在什么地方写的呢?是从机自己就包含地址(硬件)还是在软件上给从机赋值?DATASHEET里面好像没写啊 马潮老师的解答: 根据你提的问题看,你对串口多机通信的过程是不清楚的,应该先深入了解和掌握多机通信的过程。 在多机通信过程中,所有设备的RS232接口是并在通信线上的,其中只能有一个设备为主机,其他为从机,通信由主机发起。数据帧一般采用1位起始位、9位数据位,其中第9位(RXB8)被用作为表征该帧是地址帧还是数据帧。当帧类型表征位为“1”时,表示该帧数据为一个地址帧;当帧类型表征位为“0”时,表示这个帧为一
[单片机]
STM32F103标准库开发---Uart串口通信实验---初始化配置
一、Uart 串口通信 1. Uart 简介 UART 全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器 ,是一种通用串行数据总线,用于异步通信。 该总线双向通信,可以实现全双工数据发送和接收。 常用于单片机和电脑之间以及单片机和单片机之间的板级通信。 2. 接口连接方式 Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口,硬件连接比较简单,仅需要3条线。 具体连接图如下: 3. 传输方式 Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口, 一个字符一个字符地传输,每个字符一位一位地传输,并且传输
[单片机]
国产MCU的GD32E230串口通信
之前一直使用ST的STM32F031单片机,但是由于疫情还是啥啥原因,ST的芯片价格涨得没法看,因为我们是做产品,而且量比较大,ST的芯片就无法再用了,这个成本真的扛不起。 于是在很多国产MCU里面做了甄选,最终GD的因为新能优越,价格便宜获选。GD32E230对标的STM32F031,实现了PIN TO PIN兼容,寄存器不是完全兼容,但是GD的主频可以实现72M,这就很恐怖,STM32F031才48M,之前还得超频到56M使用。不得不说,GD强! 仅仅对比固件库,GD的库函数封装的比ST的库要好很多,当然,ST现在主推HAL库,这个HAL库确实也很好。 在使用串口之前同样要配置引脚,时钟。 GPIO引脚配置 void
[单片机]
STM32的ADC和串口
如果简单的使用USART的话配置相当简单,只要配置一下波特率,数据长度,停止位长度,校验位。然后再设置一下串口的引脚,输入为上后输入,输出为利用推挽输出。这样一来串口就配置好了,如果使用库则一目了然,如果使用寄存器操作会繁琐一点找各个寄存器,因为设置波特率和设置数据长度等这些并不在一个寄存器中设置完成,还有可能忘记个别设置而无法找其原因。但寄存器操作的效率会很高。如下配置: void USART_Initial(uint32_t Baud) { USART_InitTypeDef USART_InitStruct; USART_GPIO(); //配置串口引脚 USART_InitStruct.USART_BaudRate=Bau
[单片机]
STM8L的USART1串口通信详解 含例程
STM8L除了可以进行串口通信,还可支持红外通信,智能卡协议,这些功能后续会开发,发布程序源码。STM8L还可以使用DMA缓存数据,减少CPU负担,为了简单起见,本文没有用到DMA功能。 只需要简单的配置发送的字长度,停止位数,波特率,打开发送接收,就可以进行串口数据收发。下图为串口发送数据流程。 对于串口发送数据,需要注意的是,打开发送后,数据发送完成,如果不关闭中断,程序会一直进入中断。所以在确保数据发送完成后,需关闭中断,退出发送数据。 本文通过周期性(500ms)的向上位机发送一组数据,来演示STM8L的串口通信。串口接收部分程序也已经调试好,只需把while循环中的程序注释掉,设置断点,查看上位机发送来的数据
[单片机]