大家好,我是单片机爱好者-MCU起航。这一节我们介绍如何使用库函数方式控制STM8S103F3P6片上的USART接口,也叫串口。首先,我们看一下原理图,找到USART接口的位置:
如图所示,单片机上的PD5和PD6为串口收发使用的管脚。学过51的童鞋,基本看到这里就明白了,设置一下波特率、中断、收发函数,直接就可以用了。
咱们首先看一个例程,使用串口接收数据,把收到的数据自动加一,然后再发出去,代码如下:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "uart.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
Uart1_Init();
enableInterrupts(); //使能中断
while (1);
}
如上所示,主函数里仅进行了三个操作:
1、串口初始化;
2、开启全局中断;
3、原地等待。
咱们看下串口初始化部分的代码:
#include "uart.h"
void Uart1_Init(void)
{
UART1_DeInit(); /* 将寄存器的值复位 */
/*
* 将UART1配置为:
* 波特率 = 9600
* 数据位 = 8
* 1位停止位
* 无校验位
* 使能接收和发送
* 使能接收中断
*/
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_OR, ENABLE);
UART1_Cmd(ENABLE);
}
void UART1_SendByte(u8 data)
{
UART1_SendData8((unsigned char)data);
/* 等待传输结束 */
while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
}
这里有两个函数,第一个进行串口初始化,主要有几个功能:
1、波特率设置为9600,数据长度8,1个停止位,没有奇偶较验,异步时钟禁止,收发使能。
2、开启接收中断。
3、串口使能。
第二个函数更简单了,发送一个字节,用法跟51基本是一样的。
然后看中断部分:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
unsigned char ch;
ch=UART1_ReceiveData8() + 1;
UART1_SendData8(ch);
}
收到数据,加一,发出,简单,好用。
当前程序仅能发送一个字节,除此之外,我们还提供了可发送字符串的例程。
编译、下载、上电,功能正常!
打完收工!
想要获取相关程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。
博主不对使用的引脚PD5、PD6进行GPIO初始化吗?
不需要初始化就能用,你可以试试!
谢谢博主回复,我查了一下其他程序,发现STM8S标准库的例程中也是没有初始化的。我也想了一下,想通了为什么不需要设置GPIO,贴个自己在另一个论坛写的帖子关于UART配置过程中复用功能RX TX对应引脚无需配置的帖子:http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=626014&page=1&extra=#pid2514937
不知这样的想法是否正确
是的,是这样!
博主考虑出篇关于STM8S中SPI配置的文章?
暂时没考虑,用的少。
同求STM8S103F3P6的SPI配置
STM8的SPI我没用过,不过感觉是差不多的
试了楼主这个就不能用printf了
printf函数在下一篇文章里