STM8s串口通信uart

发布者:CaptivatingEyes最新更新时间:2021-03-01 来源: eefocus关键字:STM8s  串口通信  uart 手机看文章 扫描二维码
随时随地手机看文章

我使用的是stm8s103k3,32脚单片机,这个使用手册上说了UART1,UART2,UART3。但是引脚的功能图上只有UART1,并且你打开 stm8s103k.h的头文件,里面也只有UART1寄存器的定义说明。所以我认为只有UART1。既然有这个功能,那就用吧,我以为直接可以连接到电脑的串口(COM1),就可以使用了,其实不可以。单片机即使写着提供UART通讯功能,也要连接MAX232转接芯片,我就在这里耽误了许多时间。


1、使用stm8s103上的串口和计算机com口通许的硬件连接:






2、软件设置


(1)发送数据配置


1)编程UART_CR1的M位来定义字长。

2)在UART_CR3中编程停止位的位数。

3)按下列顺序编写波特率寄存器选择要求的波特率。

a)UART_BRR2

b)UART_BRR1

4)设置UART_CR2中的TEN位来使能发送

5)把要发送的数据写进UART_DR寄存器


main.c程序如下:



#include "stm8s103k.h"


void UART1_Init(void)

{

UART1_CR2=0x00;//使发送禁用TEN=0;

UART1_CR1=0x00;//设置M字长,8位数据位

UART1_CR3=0x00;//1位停止位


UART1_BRR2=0x00;//00-0d:9600(fcpu=fmaster=2MHz)

UART1_BRR1=0x0d;//00-1a:4800; 01-34:2400


UART1_CR2=0x08;

}

main()

{

//fmaster=fcpu=2MHz

CLK_ECKR=0x00;

CLK_ICKR=0x01;

CLK_CMSR=0xe1;


CLK_SWR=0xe1;

CLK_CKDIVR=0x18;


UART1_Init();


while (1)

{

unsigned char i;


while(!(UART1_SR & 0x80));//发送寄存器数据是否转移完


UART1_CR2=0x00;//a处

UART1_DR=0xB6;//要发送的数据

UART1_CR2=0x08;//b处


while((UART1_SR & 0x40) ==0);//发送是否完成


}

}


上面的代码是我反复实验过的,如果不加a和b处代码,则接收的数据不稳定,比如发送5,接收到的数据的串口多次开闭,则接收的数据可能是0xB6,或0x67,或0x3B.


(2)接收数据


1)编程UART_CR1的M位来定义字长。

2)在UART_CR3中编程停止位的位数。

3)按下列顺序编写波特率寄存器选择要求的波特率。

a)UART_BRR2

b)UART_BRR1

4)设置UART_CR2中的REN位来使能接收

5)读UART_DR寄存器

a)查询:查询SR中标志位RXNE (读数据寄存器非空)

b)中断:需使能CR2中的RIEN(接收中断使能)




标志位查询方式:

初始化:

void UART1_Init(void)

{

UART1_CR1 = 0x00; //8bit

UART1_CR3 = 0x00;//1 stop bit

UART1_BRR2 = 0x01;

UART1_BRR1 = 0x1A;//4800 baud rate

UART1_CR2 = 0x04;//enable REN

}


Main()函数:


while (!(UART1_SR & 0x20));//Loop until the UART1 Receive Data Register is not empty

RxBuffer = UART1_DR; //Store the received byte in RxBuffer





中断方式:

初始化:

void UART1_Init(void)

{

UART1_CR1 = 0x00; //8bit

UART1_CR3 = 0x00;//1 stop bit

UART1_BRR2 = 0x01;

UART1_BRR1 = 0x1A;//4800 baud rate

UART1_CR2 = 0x24;//enable REN and RIEN

}

UART1接收中断函数:

@far @interrupt void UART1_RX_IRQHandler (void)

{

RxBuffer = UART1_DR; //Store the received byte in RxBuffer

return;

}

UART1接收中断向量(设置中断向量,即将中断服务程序的入口填写到中断向量表中)

struct interrupt_vector const _vectab[] =

{

……

{0x82, UART1_RX_IRQHandler},

……

}


(3)特别注意波特率的计算设置方式


波特率通过配置16位除法器UART_DIV来设置




关键字:STM8s  串口通信  uart 引用地址:STM8s串口通信uart

上一篇:STM8 串口功能使用简介
下一篇:EWSTM8系列教程01_IAR介绍、下载、安装和注册

推荐阅读最新更新时间:2024-11-12 16:01

STM32 CUBEMX UART+DMA
参考 https://blog.csdn.net/xukao5671927/article/details/78605022 http://www.51hei.com/bbs/dpj-39885-1.html 官方参考手册 小发现: USART1_IRQHandler中的 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint32_t tmp_flag = 0; uint32_t temp; /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1);
[单片机]
s3c6410的UART设备驱动(1)
1、 这段话摘于《设备驱动开发详解》 在使用串口核心层这个通用串口tty驱动层的接口后,一个串口驱动要完成的主要工作: (1)、定义uart_driver、uart_ops、uart_port等结构体的实例并在适当的地方根据具体硬件和驱动的情况初始化它们,当然具体设备的驱动可以将这些结构体在新定义的xxx_uart_driver、xxx_uart_ops、xxx_uart_port之内。 (2)、在模块初始化是调用uart_register_driver和uart_add_port注册UART驱动并添加端口,在模块卸载时调用uart_unregister_driver和uart_remove_one_port以注销
[单片机]
s3c6410的<font color='red'>UART</font>设备驱动(1)
STM8S学习笔记之三(STM8 SysClk)
STM8S系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。。举个例子,做AVR时在高稳定的串口通讯时用的时钟一般是3.6864M,主要是这个算波特率精确。。STM8S同样重要。。 STM8S时钟源: ●1-24MHz高速外部晶体振荡器(HSE) ●最大24MHz高速外部时钟信号(HSE user-ext) ●16MHz高速内部RC振荡器(HSI) ●128KHz低速内部RC(LSI) 各个时钟源可单独打开或关闭,从而优化功耗。 对于我这么懒得人一般都是用的内部或者外部晶振。。这个芯片时钟方面很大的一个亮点就是时钟可以自由分频。在降低功耗方面,如果有特殊
[单片机]
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
基于STM32模拟<font color='red'>UART</font><font color='red'>串口通信</font>
STM8S Timer2_OC1_PWM1输出模式
C语言: Codee#11722 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台: STM8S103F2P6 FM 接收实验核心板 + 硬件 : STM8S103F2P6 + 开发平台: IAR For STM8 1.10 + 仿真器 : ST-Link + 日期 : 2010-6-22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include stm8s.h /******
[单片机]
C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序
  新PIC18 Bootloader   PhsBoot_v3.0是我最新用C语言实现的PIC bootloader, 采用串口通信,适用于PIC18, 并为其用C#写了PC端通信程序PhsLoader_v3.0。PhsLoader_v3.0通过串口按照自定义的通信协定发送数据PhsBoot_v3.0, PhsBoot_v3.0接收数据,按照通信协定解读数据,解读出其中Hex数据,并将其烧录到正确的位置。   通信协定   PIC18单片机端PhsBoot_v3.0和PC端PhsLoader_v3.0之间的通信数据包采用以下协定 STX CMD ADDRL ADDRH ADDRU LEN DATA ... DAT
[单片机]
S5PV210串口通信接口-2
1、本来串口功能就是上节讲的部分,但是后来的技术发展给串口叠加了一些高级功能,在像210这类高级SOC的串口控制器中,都有这类高级功能。 2、FIFO模式及其作用 (1)、典型的串口设计,发送 / 接收缓冲区只有1个字节,每次发送 / 接收只有处理一帧数据。这样在单片机中设计没什么问题,但是到复杂SOC中(一般有操作系统)就会有问题,会导致效率低下,因为缓冲区太小CPU需要不断切换上下文。 (2)、解决方案就是想办法扩展串口控制器的发送 / 接收缓冲区,譬如将发送 / 接收缓冲区设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发数据(后CPU可以空出时间去处理别的事),然后transmitter慢慢发,发完再找CPU
[单片机]
S5PV210<font color='red'>串口通信</font>接口-2
一起学mini2440裸机开发(七)--UART高级实验,可变参函数
概述: 在C语言中,使用printf()进行格式化输出非常方便,例如,printf( %dn ,a)可以将a的值以十进制的格式输出,然后换行。printff()函数的原型为:int printf(const char *format,...),在函数参数中的...表示可变参数,即输入参数的个数不确定(例如,printf( %dn ,a)和printf( %d%dn ,a,b)都可以使函数进行正确的输出),这种输入参数不确定的函数就叫可变参数。在UART中能不能自己写一个类似于 printf() 的函数(例如,Uart0_Printf( %d ,a))呢?下面咱们就试图找到实现这种函数的方法。 实验内容: 本实验要实现的功能就是
[单片机]
一起学mini2440裸机开发(七)--<font color='red'>UART</font>高级实验,可变参函数
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved