基本串口收发(中断接收方式)

来源:本站
导读:目前正在解读《基本串口收发(中断接收方式)》的相关信息,《基本串口收发(中断接收方式)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《基本串口收发(中断接收方式)》的详细说明。
简介: 本文是关于基本串口收发(中断接收方式)。

对于串口而言,最基本的就是 收发。

因为本例程系列及我个人的风格,我总是只让例程的功能——同时也就纯粹到 只展示这个功能的最小配置和最少代码。

而对我而言,串口 收发(1字节——因此也就不涉及另外 对 收发的缓冲处理 等 实质上 和 串口基本功能无关的 代码)。

当然大多数时候,我接收都是中断方式,而发送则无此必要——但是,我知道,在对速度有要求或者需要并行处理的场所,还需要 发送中断,但这个比较少用,因此不考虑。

下面是代码。

在贴以前,我讲一些对相关库,代码的改动。

首先,stm8s这个库,它的stm8s_uart1.c里,在计算波特率时,它需要获取当前时钟频率

它采用的是 CLK_GetClockFreq();

这个函数定义在stm8s_clk.h里

然而,在这里,它并没有包含这个头文件——我知道,它是想模仿C标准库,保证内部的十几个库之间不存在互相包含关系。

很可惜它犯了错误。

因为我做这个串口例程时始终错误,我走了不少弯路,最后想起来查对相关寄存器,发现这个波特率BRR1 BRR2从来就没正常过。

而对比我此前的105例程却是可以的。(因为我此前也改动过,而我却忘了,也没有记录下来。)

也许在某些编译器上可以允许这种错误,但是调用和返回不会出错,但是这种对具体环境的依赖绝对是 除了找死还是找死。

其次,采用 CLK_GetClockFreq() 这个函数获取系统时钟,也有不妥当之处。

因为这个函数依赖一个外部宏,那就是 HSE_VALUE;

因为事实上,STM8S内部没有真正可以用于采样获取时钟频率的硬件。

它只不过是通过 寄存器(对HSI LSI),以及这个 HSE_VALUE宏来确定频率。

我们都知道,如果我希望把这个库单独封装,那么,对外部晶振频率这种随时会变化的环境,采用宏写入库,那将是一个大麻烦。

因此这个地方是造成这个 库无法单独封装 的又一个障碍。

我暂时没想到太好的办法。

但显然,这个地方是一个隐患。

过后也许会考虑比较单纯的,采取单独增加填写 BRR1 BRR2寄存器的函数,或者想办法把外部晶振频率传递入库,让它可以获得真正的 实际频率。

//这是 主要的调用 串口模块 的函数,包含 由 main调用的测试函数(in while-loop)#include "stm8s_uart1.h"#include "Uart1.h"#include "stm8s_clk.h"U8 RecvByte = 0; U8 RecvFlag = 0;void FillRecvByte(U8 byte){ RecvByte = byte;}int isUart1Received(void){ return RecvFlag;}void clearUartReceivedFlag(void){ RecvFlag = 0;}void setUartReceivedFlag(void){ RecvFlag = 1;}void Uart1_Initial(void){ UART1_DeInit(); UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); UART1_ITConfig(UART1_IT_RXNE, ENABLE); UART1_Cmd(ENABLE);}void Uart1_Send1Byte(U8 TxData){ while(UART1_GetFlagStatus(UART1_FLAG_TXE) == 0); UART1_SendData8(TxData);}void Uart_Recv_Trans_BasicTest(void){ while(1) { if(RecvFlag) { RecvFlag = 0; Uart1_Send1Byte(~RecvByte); } }}// 接着是简单的 串口接收中断 服务程序#include "typedef.h"#include "Uart1.h"#include "stm8s_uart1.h"#include "stm8s_it.h"INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17){}INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18){ UART1_ClearITPendingBit(UART1_IT_RXNE); FillRecvByte(UART1_ReceiveData8()); setUartReceivedFlag();}// 最后是简单的main函数#include "stm8s.h"#include "Uart1.h"void main(void){ Uart1_Initial(); __enable_interrupt(); Uart_Recv_Trans_BasicTest();}// end of file -----------------------------------------------------------------

提醒:《基本串口收发(中断接收方式)》最后刷新时间 2024-03-14 01:12:49,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《基本串口收发(中断接收方式)》该内容的真实性请自行鉴别。