基于STM8的UART发送和中断接收---STM8-第二章
1. 综述
UART的基础知识,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。
做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,UART会比较常用到,所以在此对UART串口进行一个说明。
2. 关于STM8S103手册的UART简介
3. UART初始化参数详细讲解
3.1 BaudRate(波特率)
所谓的波特率就是每秒钟传送的码元符号的个数,可以理解为串口的输出速率。可选的波特率有很多,常用的波特率有115200bps,9600bps等...
3.2 WordLength(数据长度)
即为传输的数据转成二进制后有多少位。可选的数据位数:8位、9位,常用的数据位数为8位。
3.3 StopBits(停止位)
即为数据帧的尾部传输停止位个数。可选的停止位:0.5位、1位、1.5位、2位,常用的停止位为1位。
3.4 Parity(奇偶校验)
即为输出结果是否经过奇偶校验,根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。可选的奇偶校验:奇校验、偶校验、不进行奇偶校验。常用的为不进行奇偶校验。
3.5 SyncMode(同步模式 )(本博客对此模式只进行一个粗略讲解,如想深入了解,请察看官方的手册。)
通信时双方是否有共同的时钟参考,能否通过时钟参考准确收发数据。可选择的模式有很多,常用的模式为 同步模式禁用,SLK PIN禁用。
3.6 Mode(UART模式)
可选的模式:接收使能、接收不使能、发送使能、发送不使能、发送接收都使能。常用的模式为发送接收都使能。
4. 例程
4.1 编译环境
我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。
4.2 主芯片
我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。
4.3 库文件的添加
我们的工程可以在IAR中的官方例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就可以开始编写代码了(如果你将全部的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。)如图。
4.4 代码
4.4.1 UART初始化
我们所要用到的IO口和Uart都需要初始化,而IO的初始化就比较简单,具体步骤可以参考我上一篇博客,UART的初始化就需要到stm8s_uart1.c库文件中找到相对应的函数进行调用才能初始化成功。该库文件中的大部分函数都有一定意义和价值,大家可以根据需求进行调用,我这里就不进行一一细述了。
下面是串口初始化的函数。
1 /******************************************************************************* 2 * Function Name : MX_UART1_Init 3 * Description : UART1_Init 4 * Input : None 5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 void MX_UART1_Init(void) 9 { 10 //初始化UART中的所有寄存器 11 UART1_DeInit(); 12 13 //发送接收引角口初始化 14 GPIO_Init(Uart_TX_GPIO_Port, Uart_TX, GPIO_MODE_OUT_PP_HIGH_FAST); 15 GPIO_Init(Uart_RX_GPIO_Port, Uart_RX, GPIO_MODE_IN_PU_IT); 16 17 //UART的参数初始化 18 UART1_Init(115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); 19 20 //UART中断使能 21 UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); 22 23 //使能UART 24 UART1_Cmd(ENABLE); 25 26 //中断使能 27 enableInterrupts(); 28 29 }
扩展一下基本知识就是:起始位 +数据(8位) +停止位(这里没有校验位)。
所以我们传输一个字节数据要用到10个位。这样算下来 115200/10 = 11520 字节/s。(即速度为11520 B/s)
通俗一点的说的话,KB是1024个B,11520 (B/S) / 1024 = 11.25KB/S就是我们这个功能所拥有的速度了。
这个是为了让你知道它的速度局限在哪里。因此来做一些它所力所能及的事情。
4.4.2 发送
我们使用的是unsigned char类型的数据,所以要在stm8s_uart1.c文件里找到UART1_SendData8(uint8_t Data)函数然后放在main函数里调用就行,然后发送字符串的话,我们需要用到此函数。此函数在库函数中没有,所以需要我们手动添加进去,不过也相当于该库文件的一个功能,我们可以直接将此函数放进库文件里面,位置就放在发送函数UART1_SendData8(uint8_t Data)的下面即可。
1 /** 2 * @brief Transmits 8 bit *data through the UART peripheral. 3 * @param Data: the data to transmit. 4 * @retval None 5 */ 6 void UART1_SendWord(uint8_t *Data) 7 { 8 while(*Data) 9 { 10 UART1_SendData8(*Data++); 11 while(!UART1_GetFlagStatus(UART1_FLAG_TXE)); 12 } 13 14 }
这里直接调用这两个函数便可实现发送。不过,发送的数据0x31是十六进制数,转成10十进制后为49,即为1的ASCII值。
1 UART1_SendData8(0x31); 2 UART1_SendWord("国维不行");
实验结果:
4.4.2 中断接收
1 if(UART1_GetITStatus(UART1_IT_RXNE) != RESET) //检查指定的UART1中断是否发生。 2 { 3 UART1_SendData8(UART1_ReceiveData8()); //将接收的数据再用串口发送出去 4 UART1_ClearITPendingBit(UART1_IT_RXNE); //清除UART1挂起标志 5 }
由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,我们需要打开将上面的代码加入函数内部中,如图。
如果不懂的如何操作中断函数,请看这里:我们只需要在中断的库函数里面添加代码即可,不用在主函数中对该中断函数进行调用,只要我们使能中断,系统会自动帮我们运行该函数的。
注意:这里的中断处理有芯片型号的区分,如果不是STM8S103芯片请自行选择相对应的芯片的中断处理函数。
实验结果:
5. 结尾
相对来说,STM8库文件的UART调用还是比较容易的,希望该博客能够帮助到大家实现UART功能。
对STM8的UART的说明和引用到这里结束,感谢各位看官的点击。
如果觉得有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。
作 者:浩宇99✌ 出 处:https://www.cnblogs.com/zhenghaoyu/p/10698471.html
版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。