Présentation de trois
ports série différents Le déroulement de la configuration de la communication série:
- Déterminez l'horloge principale et entrez l'initialisation du port série.
À ce stade, si l'horloge sur puce HSI est sélectionnée, il peut y avoir des erreurs et la précision du HSE peut être meilleure. - Définir le nombre de bits de données envoyés
- Définissez le chiffre de contrôle et la méthode de contrôle des données envoyées
- Définir le nombre de bits d'arrêt pour l'envoi de données
- Définir le débit en bauds d'envoi de données
- Activer la fonction d'interruption d'envoi
Cette étape peut également être interrogée directement, pas besoin d'activer l'interruption, il y a une fonction de service d'interruption en cas d'interruption - Activer la fonction d'envoi
- L'envoi de données à un octet
peut être redirigé, il suffit de réécrire les fonctions associées - En attente d'envoi
Les principaux registres:
-
La structure du cadre est la suivante
-
Comment configurer les bits de données (la deuxième partie de la structure de trame)
-
Comment configurer le bit de contrôle (la troisième partie de la structure de trame)
bit de contrôle et description du format de trame de données
UART1_CR1 = 0x00;
//**************************************************
//展开UART1_CR1赋值二进制数值为:0000 0000
//含义:R8=0; 接收数据位不存在第9位
// T8=0; 发送数据位不存在第9位
// UARTD=0; 使能UART功能
// M=0; 一个起始位,8个数据位,n个停止位
// n取决于UART1_CR3中的STOP[1:0]位
// WAKE=0; UART被空闲总线唤醒
// PCEN=0: (UART模式)奇偶校验控制被禁止
// PS=0; 偶校验(校验功能未启用)
// PIEN=0; 校验中断被禁止
//*************************************************
- Comment définir le bit d'arrêt (la troisième partie de la structure de trame)
UART1_CR3 = 0x00;
//**************************************************
//展开UART1_CR3赋值二进制数值为:0000 0000
//含义:保留位=0;必须保持清零
// LINEN=0;LIN模式被禁止
// STOP=00;配置为“00”,1个停止位
// CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
//*************************************************
- Comment régler le débit en bauds
Remarque: Les deux bits du registre BRR1 ne peuvent pas être 0 en même temps et la valeur attribuée ne peut pas être inférieure à 16 (0x000f), sinon le port série ne peut pas être utilisé et le débit en bauds devient invalide
//配置通信波特率参数,此处配置为9600bps(16MHz频率下)
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;
- Activer le paramètre de bit
//使能发送和接收功能
UART1_CR2 = 0x0C;
//**************************************************
//展开UART1_CR2赋值二进制数值为:0000 1100
//含义:TIEN=0;发送中断被禁止
// TCIEN=0;发送中断完成被禁止
// RIEN=0;接收中断被禁止
// ILIEN=0;IDLE中断被禁止
// TEN=1;发送功能使能
// REN=1;接收功能使能
// RWU=0;(UART模式)正常工作模式
// SBK=0;未发送断开字符
//*************************************************
}
- Registre d'état (utilise principalement TXE, TC, PE trois bits)
Deux façons d'envoyer des données:
- Le premier: utilisez le décalage du pointeur pour sortir en continu la chaîne
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data,无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
UART1_SR&=0xBF;//清零发送完成标志位TC
UART1_DR=data;//发送数据到UART1数据寄存器
//while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
//原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
//发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
UART1_SR&=0xBF;//清零发送完成标志位TC
}
/****************************************************************/
//发送字符串函数UART1_SendString(),有1个形参Data,无返回值
/****************************************************************/
void UART1_SendString(u8* Data)
{
while(*Data!='\0')//判断字符串结束标志
{
UART1_SendByte(*Data);//把字符串拆分为多个单字节发送动作
Data++;//指针后移,不断指向新的字符
}
}
u8 table1[]="************************************************************\r\n";
UART1_SendString(table1);//发送字符串1
//UART1_SendByte(0x0D);//回车符号
//UART1_SendByte(0x0A);//换行符号
- La seconde: redéfinir la fonction putchar, afin que les données puissent être directement sorties sur le port série dans printf
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data,无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
UART1_SR&=0xBF;//清零发送完成标志位TC
UART1_DR=data;//发送数据到UART1数据寄存器
//while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
//原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
//发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
UART1_SR&=0xBF;//清零发送完成标志位TC
}
/****************************************************************/
//发送字符重定向函数putchar(),有形参ch,有返回值
/****************************************************************/
int putchar(int ch)
{
UART1_SendByte((u8)ch);//将Printf内容发往串口
return (ch);
}
printf("************************************************************\r\n");
On peut voir que la deuxième méthode est plus pratique et que les deux méthodes peuvent produire des informations.
- Comment recevoir des données
/****************************************************************/
//接收单字符函数UART1_ReceiveByte(),无形参data,有返回值,返回接收到的数据
//采用查询的方法实现
/****************************************************************/
u8 UART1_ReceiveByte(void)
{
// printf("进入UART1_ReceiveByte函数...\r\n");
u8 UART1_RX_BUF; //定义接收数据暂存变量
while (!(UART1_SR & 0x20)); //等待接收标志
UART1_SR&=0xDF; //清零接收标志位RXNE
UART1_RX_BUF=UART1_DR; //取回接收到的数据
// printf("取回接收到的数据\r\n");
return UART1_RX_BUF; //返回暂存变量中的数据给调用者
}
code montrer comme ci-dessous:
/****************************************************************/
//初始化函数UART1_Init(),无形参和返回值
/****************************************************************/
void UART1_Init(void)
{
//1.设定通信数据位数,此处设定为8位数据位,无校验位
UART1_CR1 = 0x00;
//**************************************************
//展开UART1_CR1赋值二进制数值为:0000 0000
//含义:R8=0; 接收数据位不存在第9位
// T8=0; 发送数据位不存在第9位
// UARTD=0; 使能UART功能
// M=0; 一个起始位,8个数据位,n个停止位
// n取决于UART1_CR3中的STOP[1:0]位
// WAKE=0; UART被空闲总线唤醒
// PCEN=0: (UART模式)奇偶校验控制被禁止
// PS=0; 偶校验(校验功能未启用)
// PIEN=0; 校验中断被禁止
//*************************************************
//2.设定通信停止位位数,此处设定为1位停止位
UART1_CR3 = 0x00;
//**************************************************
//展开UART1_CR3赋值二进制数值为:0000 0000
//含义:保留位=0;必须保持清零
// LINEN=0;LIN模式被禁止
// STOP=00;配置为“00”,1个停止位
// CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
//*************************************************
//3.配置通信波特率参数,此处配置为9600bps(16MHz频率下)
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;
//4.使能发送和接收功能
// UART1_CR2 = 0x0C;
UART1_CR2 = 0x2C;
//**************************************************
//展开UART1_CR2赋值二进制数值为:0010 1100
//含义:TIEN=0;发送中断被禁止
// TCIEN=0;发送中断完成被禁止
// RIEN=1;接收中断开启
// ILIEN=0;IDLE中断被禁止
// TEN=1;发送功能使能
// REN=1;接收功能使能
// RWU=0;(UART模式)正常工作模式
// PIEN=0;未发送断开字符
//*************************************************
}
//测试代码
void UART1_Module(void)
{
u8 databuf[] = "****************************************\n";
UART1_SendString(databuf);
printf("Clichong\n");
UART1_SendString(databuf);
}