#include "uart.h"
#include "stdio.h"
#include "main.h"
#define CHECK_NONE 1 //无校验位 1有效 0 无效
#define CHECK_EVEN 0 //偶数校验 1有效 0 无效
#define CHECK_ODD 0 //奇数校验 1有效 0 无效
u8 SendBuf[MaxDataLen] = {0};
u8 ReceiveBuf[MaxDataLen] = {0};
u8 RecIndexLen = 0;
/*
//在Library Options中将Printf formatter改成Large
//重新定向putchar函数,使支持printf函数
int putchar(int ch)
{
while(!(UART1_SR&0X80));//循环发送,直到发送完毕
UART1_DR = (u8) ch;
return ch;
}
*/
void Uart1_IO_Init( void )
{
PD_DDR |= ( 1 << 5 ); //输出模式 TXD
PD_CR1 |= ( 1 << 5 ); //推挽输出
PD_DDR &= ~( 1 << 6 ); //输入模式 RXD
PD_CR1 &= ~( 1 << 6 ); //浮空输入
}
//波特率最大可以设置为38400
void Uart1_Init( unsigned int baudrate )
{
unsigned int baud;
baud = 16000000 / baudrate;
Uart1_IO_Init();
#if CHECK_NONE // 如果CHECK_NONE 为真
UART1_CR1 = 0x00; //CR1 M=0 无校验位 设置M字长=0, 起始位|8位数据位|结束位 无校验
#elif CHECK_ODD
UART1_CR1 = 0x16; //CR1 M=1 有校验位 设置M字长=1,起始位|8位数据位|奇偶校验位|结束位 奇校验odd
#elif CHECK_EVEN
UART1_CR1 = 0x14; //CR1 M=1 有校验位 设置M字长,起始位|8位数据位|奇偶校验位|结束位 偶校验even
#endif
UART1_CR2 = 0;
UART1_CR3 = 0;
UART1_BRR2 = ( unsigned char )( ( baud & 0xf000 ) >> 8 ) | ( ( unsigned char )( baud & 0x000f ) );
UART1_BRR1 = ( ( unsigned char )( ( baud & 0x0ff0 ) >> 4 ) );
UART1_CR2_bit.REN = 1; //接收使能
UART1_CR2_bit.TEN = 1; //发送使能
UART1_CR2_bit.RIEN = 1; //接收中断使能
}
//阻塞式发送函数
void SendChar( unsigned char dat )
{
while( ( UART1_SR & 0x80 ) == 0x00 ); //发送数据寄存器空
UART1_DR = dat;
}
//发送字符串
void SendString( unsigned char* s )
{
while( 0 != *s )
{
SendChar( *s );
s++;
}
}
//发送一组数据
void Uart1_Send( unsigned char* DataAdd, unsigned char len )
{
unsigned char i;
for( i = 0; i < len; i++ )
{
SendChar( DataAdd[i] );
}
}
//接收中断函数 中断号18
#pragma vector = 20 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void UART1_Handle( void )
{
u8 res = 0;
#if CHECK_NONE
res = UART1_DR;
ReceiveBuf[RecIndexLen++] = res;
#else
if( UART1_SR_bit.FE == 0 ) //奇偶校验正确存储数据
{
res = UART1_DR;
ReceiveBuf[RecIndexLen++] = res;
}
else //奇偶校验错误,再次读取DR寄存器清除奇偶校验标志位
{
res = UART1_DR;
}
#endif
return;
}
STM8S003单片机是意法半导体(STMicroelectronics)生产的一款8位微控制器,属于STM8系列。该单片机以其低功耗、高性能和丰富的外设集而受到广泛应用。在这个示例中,我们将关注的是STM8S003的串行通信功能,特别是关于奇偶校验的配置。 串口通信,也称为UART(通用异步收发传输器),是嵌入式系统中常用的通信协议,用于设备之间的短距离、低速数据传输。STM8S003内建了UART模块,支持多种配置,包括波特率、数据位、停止位以及我们关注的奇偶校验位。 奇偶校验是一种简单但有效的错误检测方法,它通过在数据帧中添加一个额外的位来确保数据帧中“1”的总数是奇数或偶数。有三种基本的奇偶校验模式:无校验、奇校验和偶校验。无校验不添加额外的校验位;奇校验确保数据帧中“1”的个数为奇数;偶校验则确保“1”的个数为偶数。 在STM8S003的UART配置中,你可以选择以下步骤进行奇偶校验设置: 1. 初始化UART:你需要设置UART的工作模式,如波特率、数据位数(通常8位)、停止位(1位或2位)以及奇偶校验位的选择。在STM8S003的UART初始化函数中,可以设置`UART_ParityConfig`来选择奇偶校验模式,例如`UART_PARITY_NONE`表示无校验,`UART_PARITY_EVEN`表示偶校验,`UART_PARITY_ODD`表示奇校验。 2. 配置波特率:使用`UART_BaudRateConfig`函数设定通信速率。这通常基于系统时钟和预分频因子来计算。 3. 开启UART:调用`UART_Cmd`开启串口通信,确保接收和发送功能都已激活。 4. 数据传输:在发送数据时,可以使用`UART_SendData`将数据写入发送缓冲区,然后等待发送完成中断(如果启用的话)。接收数据时,可以通过`UART_ReceiveData8`函数获取接收到的字节。 5. 错误检测:奇偶校验在接收到数据后进行,如果检测到的奇偶性与预期不符,STM8S003的UART模块会设置相应的标志位,如`UART_FLAG_PE`(奇偶错误),可以通过`UART_GetFlagStatus`检查这些标志来判断是否存在错误。 通过这个STM8S_UART示例项目,你可以编写代码实现以上步骤,对STM8S003的串口通信功能进行验证。通过改变奇偶校验设置,你可以观察到不同校验方式下的通信效果,理解其在实际应用中的作用和差异。例如,奇偶校验可以提高通信的可靠性,尤其是在噪声环境中,但它的错误检测能力有限,只能发现单比特错误,无法检测多比特错误。 总结来说,STM8S003单片机的串口通信功能强大且灵活,能够适应各种应用需求。奇偶校验是其中的一个重要特性,用于增加数据传输的可靠性。通过实践和实验,开发者可以更好地理解和掌握这一功能,从而在设计项目中合理利用串口通信的优势。





























































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 11w+
- 资源: 174
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- MATLAB、python、stata、r做演化博弈 (2).zip
- 基于 OpenPose 的人体姿态估计系统(支持深蹲/俯卧撑/硬拉识别 - Python源码+Streamlit界面)图像识别项目源码资源
- 基于vue + springboot的学生成绩管理系统
- 运动控制与数控系统:插补及加减速算法的FPGA实现及优化技巧
- vim 9 离线安装包 for windows
- (源码)基于微控制器和 TEA5767 芯片的 FM 广播播放系统.zip
- Delphi 12.3控件之msys2-x86-64-20230318.rar
- 工业领域变频器技术方案:涵盖线路板设计、元器件采购与生产全流程指导
- (源码)基于Arduino的实时温度短信警报系统.zip
- Delphi 12.3控件之MonoLisa V2.016.rar
- (源码)基于Keil uVision和C语言的多功能媒体中心.zip
- 激光焊接机控制系统详解:充电箱、放电箱、主控板及触摸屏的集成方案
- Delphi 12.3控件之MMX-Setup-15-1-13-2639.rar
- (源码)基于C++语言的游戏运行时数据dump工具.zip
- Delphi 12.3控件之MiTeC-System-Information-Component-Suite-15.1.0-Full-Source.rar
- (源码)基于PythonPyTorch框架的多模态融合模型系统.zip


