STC32G 系列单片机有4个全双工通用串行通信接口,串口1与串口2既有异步通信功能、又有同步通信功能,串口1与串口2都可进行SPI通信,SPI是一个全双工高速同步串行;通信总线串口3、串口4只有异步通信功能。本文将重点讨论其异步通信(UART)功能。
STC32G 单片机通用串行通信接口可以进行管脚切换。串口编程涉及接口管脚选择设置,通信模式设置,波特率发生器定时器(需要定时器做波特率发生器,单片机串口通信接口内部没有波特率发生器)选择设置,波特率设置、数据发生与数据接收等。
串口1的管脚可在4组管脚间切换,通过寄存器P_SW1的B6~B7位设置,如下:
串口2的管脚可在2组管脚间切换,通过寄存器P_SW2的B0位设置,如下:
串口3及串口4的管脚可分别在2组管脚间切换,串口3通过寄存器P_SW2的B1位设置,串口4通过寄存器P_SW2的B2位设置,如下:
STC32G 系列单片机串口通信(UART)模式有4种,如下:
串口1与串口2可工作在以上4种的任一模式下,串口3与串口4只能工作在可变波特率8位数据方式或9位可变数据方式。串口1的工作模式通过串口1的控制寄存器SCON的B6~B7位来设置,如下:
串口2的工作模式通过串口2的控制寄存器S2CON的B6~B7位来设置,如下:
串口3的工作模式通过串口1的控制寄存器S3CON的B7位来设置,如下:
串口4的工作模式通过串口4的控制寄存器S4CON的B7位来设置,如下:
串口1可选择(通用)定时器1或2做波特率发生器,通用定时器0不可做波特率发生器。串口1的波特率发生定时器通过辅助寄存器AUXR的B0位(S1BRT)来设置:0-选择T2做波特率发生器,1-选择T1做波特率发生器。串口2固定用(通用)定时器2做波特率发生器。串口3可选择(通用)定时器T2或T3做波特率发生器,串口4可选择(通用)定时器T2或T4做波特率发生器。串口3的波特率发生定时器通过寄存器S3CON的B6位(S3ST3)来设置:0-选择T2做波特率发生器,1-选择T3做波特率发生器。串口4的波特率发生定时器通过寄存器S4CON的B6位(S3ST3)来设置:0-选择T2做波特率发生器,1-选择T4做波特率发生器。
模式0与模式2为固定波特率。串口1模式0的波特率固定为系统时钟的12分频或2分频,。当辅助寄存器AUXR的B5位(S1M0x6)设置为0时波特率固定为系统时钟的12分频,设置为1时波特率固定为系统时钟的2分频。串口2模式0时,情况也相似。串口2是通过S2M0x6(S2CFG的B5位)来设置,设置为0时波特率固定为系统时钟的12分频,设置为1时波特率固定为系统时钟的2分频。模式2的波特率固定位系统时钟32分频或64分频。串口1通过PCON中的SMOD来设置:0-波特率为系统时钟的64分频,1-波特率为系统时钟的32分频。串口2通过S2CFG寄存器B6位的S2MOD0来设置:0-波特率为系统时钟的64分频,1-波特率为系统时钟的32分频。以上两种模式为串口1与串口2特有工作模式。
应用最多的位可变波特率8位数据、其次为可变工作频率9位数据,可变波特率模式的常用的波特率如下:4800,9600,19200,38400,57600,115200;最常用的是9600,很多仪器设备缺省的波特率都是9600,。在设置波特率时,最好在常用波特率中选择,最好不要设置随意的波特率,特别是与上位机通信时更应如此。串口1波特率的计算公式如下:
其实当SMOD设置为0如果我们将选做比特率发生器的定时器其都设置为16位自动重装模式,定时器时钟设置为1T或12T模式,不同串口波特率计算及定时器重装值都可采用相同公式,即:
定时器在1T模式
定时器在12T模式
这里不过多讨论波特率计算问题,前面“STC32G 单片机系列通用定时器的用法及编程”一文中已经给出了定时器做波特率发生器的初始化函数。
如果要发送数据,在串口初始化设置好后,就向串口的数据寄存器写入要发生的数据。要接收数据,就在接收中断标志请求位置1后都数据寄存器。
要进行串口编程离不开对串口相关寄存器的操控,STC32G 系列单片机串口相关的寄存器如下:
要详细了解各寄存器的作用,可仔细阅读STC32G用户手册。这里不再做进一步介绍。
STC提供了串口通信的官方库函数,我觉得用起来有些不习惯,自己写了库函数,如下:
头文件
/*STC32G_UART.h
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu ,07/12/2022
///enum//
UART_MODE //SYC_SHIFT~VBAUD_9BITS
PIN_GROUP //G1~G4
/macro function//
UART1_MODESEL_SYC_SHIFT();
UART1_MODESEL_VBAUD_8BITS();
UART1_MODESEL_CBAUD_9BITS();
UART1_MODESEL_VBAUD_9BITS();
UART1_MODESEL(selMode);
UART1_PINSEL_P30P31();
UART1_PINSEL_P36P37();
UART1_PINSEL_P16P17();
UART1_PINSEL_P43P44();
UART1_PINSEL(selPins); //selPins type is PIN_GROUP
UART1_BGTIMERSEL_T1(); //sel T1 as baudrate generator
UART1_BGTIMERSEL_T2(); //sel T1 as baudrate generator
UART1_BGTIMERSEL(selT2); //selT2 type is BOOL
UART1_RESETRI(); //reset RI flag
UART1_RESETRI(); //reset RI flag
UART1_CLEARFLAG(); //clear flag
UART2_MODESEL_SYC_SHIFT();
UART2_MODESEL_VBAUD_8BIT();
UART2_MODESEL_CBAUD_9BITS();
UART2_MODESEL_VBAUD_9BITS();
UART2_MODESEL(selMode);
UART2_PINSEL_P10P11();
UART2_PINSELP_46P47();
UART2_PINSEL(selPins); //selPins type is PIN_GROUP
UART2_RESETRI();
UART2_RESETTI();
UART2_CLEARFLAG();
UART3_MODESEL_VBAUD_8BITS();
UART3_MODESEL_VBAUD_9BITS();
UART3_MODESEL(selMode);
Uart3_PinSel_P00P01();
UART3_PINSEL_P50P51();
UART3_PINSEL(selPins); //selPins type:s PIN_GROUP
UART3_BGTIMERSEL_T2();
UART3_BGTIMERSEL_T2();
UART3_BGTIMERSEL(selT3); //selT3 type: BOOL
UART3_RESETRI();
UART3_RESETTI();
UART3_CLEARFLAG();
UART4_MODESEL_VBAUD_8BITS();
UART4_MODESEL_VBAUD_9BITS();
UART4_MODESEL(selMode); //selMode type:UART_MODE
UART4_PINSEL_P02P03();
UART4_PINSEL_P52P53();
UART4_PINSEL(selPins; //selPins type:PIN_GROUP
UART4_BGTIMERSEL_T2();
UART4_BGTIMERSEL_T4();
UART4_BGTIMERSEL(selT4); //selT4 type: BOOL
UART4_RESETRI();
UART4_RESETTI();
UART4_CLEARFLAG();
///Function/
Uart1_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate); //return void
Uart1_SendByte(BYTE mData); //return void
Uart1_RecByte(BYTE* mchar); //return BOOL
Uart1_SendString(BYTE* str); //return void
Uart1_SendStrAndEof(BYTE* str); //return void
Uart1_RecString(BYTE* str, ui8 nchar); //return BOOL
Uart1_RecStrTillEof(BYTE* str); //return BOOL
Uart2_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate); //return void
Uart2_SendByte(BYTE mData); //return void
Uart2_RecByte(BYTE* mchar); //return BOOL
Uart2_SendString(BYTE* str); //return void
Uart2_SendStrAndEof(BYTE* str); //return void
Uart2_RecString(BYTE* str, ui8 nchar); //return BOOL
Uart2_RecStrTillEof(BYTE* str); //return BOOL
Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate); //return void
Uart3_SendByte(BYTE mData); //return void
Uart3_RecByte(BYTE* mchar); //return BOOL
Uart3_SendString(BYTE* str); //return void
Uart3_SendStrAndEof(BYTE* str); //return void
Uart3_RecString(BYTE* str, ui8 nchar); //return BOOL
Uart3_RecStrTillEof(BYTE* str); //return BOOL
Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate); //return void
Uart3_SendByte(BYTE mData); //return void
Uart3_RecByte(BYTE* mchar); //return BOOL
Uart3_SendString(BYTE* str); //return void
Uart3_SendStrAndEof(BYTE* str); //return void
Uart3_RecString(BYTE* str, ui8 nchar); //return BOOL
Uart3_RecStrTillEof(BYTE* str); //return BOOL
*/
#ifndef __STC32G_UART_H
#define __STC32G_UART_H
#include "config.h"
#include "mtype.h"
#include <STC32G.H>
#include "STC32G_Timer.h"
typedef enum
{
SYC_SHIFT = 0, //sychronous shift, mode0, for S1 S2only
VBAUD_8BITS, //8bits, variable baudrate,mode1 for S1,S2,S3,S4
CBAUD_9BITS, //9bits, constant baudrate,mode2,for S1 S2 only
VBAUD_9BITS //9bits, variable baudrate, mode3,for S1,S2,S3,S4
}UART_MODE;
//************UART PIN GROUP****************************
typedef enum
{
G1 = 0, //uart1:P30/Rx,P31/Tx uart2:P10/Rx,P11/Tx uart3: P00/Rx,P01/Tx uart4: P02/Rx,P03/Tx
G2, //uart1:P36/Rx,P37/Tx uart2:P46/Rx,P47/Tx uart3: P50/Rx,P51/Tx uart4: P52/Rx,P53/Tx
G3, //uart1:P16/Rx,P17/Tx
G4 //uart1:P43/Rx, P44/Tx
}PIN_GROUP;
///Uart S1//
#define UART1_MODESEL_SYC_SHIFT() {SM1 = 0; SM0 = 0; }
#define UART1_MODESEL_VBAUD_8BITS() {SM1 = 1; SM0 = 0; }
#define UART1_MODESEL_CBAUD_9BITS() {SM1 = 0; SM0 = 1; }
#define UART1_MODESEL_VBAUD_9BITS() {SM1 = 1; SM0 = 1; }
#define UART1_MODESEL(selMode) {SM1 = (selMode)&0x01; SM0 = ((selMode) >> 1)&0x01;} //selMode type is UART_MODE
/**********************************************************************/
#define UART1_PINSEL_P30P31() {S1_S1 = 0; S1_S0 = 0;}
#define UART1_PINSEL_P36P37() {S1_S1 = 0; S1_S0 = 1;}
#define UART1_PINSEL_P16P17() {S1_S1 = 1; S1_S0 = 0;}
#define UART1_PINSEL_P43P44() {S1_S1 = 1; S1_S0 = 1;}
#define UART1_PINSEL(selPins) {S1_S0 = (selPins)&0x01; S1_S1 = ((selPins) >> 1)&0x01;} //selPins type is PIN_GROUP
/**********************************************************************/
#define UART1_BGTIMERSEL_T1() {S1BRT = 0;}
#define UART1_BGTIMERSEL_T2() {S1BRT = 1;}
#define UART1_BGTIMERSEL(selT2) {S1BRT = (selT2);} //selT2 type is BOOL
#define UART1_RESETRI() {RI = 0;}
#define UART1_RESETTI() {TI = 0;}
#define UART1_CLEARFLAG() {RI = 0;TI = 0;}
/***********************************************************
Function: Uart1_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate);
Return value: void
mode: uart1 work mode
pGroup: pin group uart1 will use
selT1: 1-select T1 ar baudrate generator, 0-T2 as baudrate generator
baudrate: badrate uart1 will use
Discription: uart1(s1) init
Example:
UartS1_Init(VBAUD_8BITS, G1, 0, 9600); //8bit variable baudrate, Pin:P30/P31, T2 as generator, badrate: 9600
***********************************************************************/
void Uart1_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate);
/***********************************************************
Function: Uart1_Sendbyte(BYTE mData);
Return value: void
mData: byte to send
Discription: send byte by uart1(S1)
Example:
Uart1_SendByte(0xFE);
***********************************************************************/
void Uart1_SendByte(BYTE mData);
/***********************************************************
Function: Uart1_RecByte(BYTE* mchar);
Return value: BOOL
mchar: variable to store received data
Discription: uart1(S1) receive byte data
Example:
char tem;
BOOL mBOOL;
mBOOL= Uart1_RecByte(&tem);
***********************************************************************/
BOOL Uart1_RecByte(BYTE* mchar);
/***********************************************************
Function: Uart1_SendString(BYTE* str);
Return value: void
str: string will be sent
Discription: uart1(S1) send string
Example:
Uart1_SendString("Hello world!");
***********************************************************************/
void Uart1_SendString(BYTE* str);
/***********************************************************
Function: Uart1_SendStrAndEof(BYTE* str);
Return value: void
str: string will be sent
Discription: uart1(S1) send string and end flag
Example:
Uart1_SendStrAndEof("Hello world!");
***********************************************************************/
void Uart1_SendStrAndEof(BYTE* str);
/***********************************************************
Function: Uart1_RecString(BYTE* str, ui8 nchar);
Return value: BOOL
str: char array to store received string
nchar; number of char to receive
Discription: S1 receive n character & store in str
Example:
Uart1_RecString(cmstr, 8);
***********************************************************************/
BOOL Uart1_RecString(BYTE* str, ui8 nchar);
/***********************************************************
Function: Uart1_RecStrTillEof(BYTE* str);
Return value: BOOL
str: char array to store received string
Discription: uart1(S1) receive character continue ,till received Eof
Example:
ui8 mstr[20];
Uart1_RecStrTillEof(mstr);
***********************************************************************/
BOOL Uart1_RecStrTillEof(BYTE* str);
///Uart S2//
#define UART2_MODESEL_SYC_SHIFT() {S2SM1 = 0; S2SM0 = 0;}
#define UART2_MODESEL_VBAUD_8BIT() {S2SM1 = 0; S2SM0 = 1;}
#define UART2_MODESEL_CBAUD_9BITS() {S2SM1 = 1; S2SM0 = 0;}
#define UART2_MODESEL_VBAUD_9BITS() {S2SM1 = 1; S2SM0 = 1;}
#define UART2_MODESEL(selMode) {S2SM1 = (selMode)&0x01; S2SM0 = ((selMode) >> 1)&0x01;} //selMode type is UART_MODE
#define UART2_PINSEL_P10P11() {S2_S = 0;}
#define UART2_PINSELP_46P47() {S2_S = 1;}
#define UART2_PINSEL(selPins) {S2_S = (selPins);} //selPins type is PIN_GROUP
#define UART2_RESETRI() {S2RI = 0;}
#define UART2_RESETTI() {S2TI = 0;}
#define UART2_CLEARFLAG() {S2RI = 0;S2TI = 0;}
/***********************************************************
Function: Uart2_Init(UART_MODE mode,PIN_GROUP pGroup,ui32 baudrate);
Return value: void
Discription: uart2(s2) init
Example:
Uart2_Init(VBAUD_8BITS, G1, 9600);
***********************************************************************/
void Uart2_Init(UART_MODE mode,PIN_GROUP pGroup,ui32 baudrate);
/***********************************************************
Function: Uart2_SendByte(BYTE mData);
Return value: void
mData: byte to send
Discription: send byte by uart2(S2)
Example:
Uart2_SendByte(0xFE);
***********************************************************************/
void Uart2_SendByte(BYTE mData);
/***********************************************************
Function: Uart2_RecByte(BYTE* mchar);
Return value: BOOL
mchar: char variable to receive char
Discription: S2 receive byte data
Example:
char tem;
BOOL bRece;
bRece = Uart2_RecByet(&tem);
***********************************************************************/
BOOL Uart2_RecByte(BYTE* mchar);
/***********************************************************
Function: Uart2_SendString(char* str);
Return value: void
str: string to send
Discription: uart2(S2) send string
Example:
Uart2_SendString("Hello world!");
***********************************************************************/
void Uart2_SendString(BYTE* str);
/***********************************************************
Function: Uart2_SendStrAndEof(BYTE* str);
Return value: void
str: string to send
Discription: uart2(S2) send string and end flag
Example:
Uart2_SendStrAndEof("Hello world!");
***********************************************************************/
void Uart2_SendStrAndEof(BYTE* str);
/***********************************************************
Function: Uart2_RecString(BYTE* str, ui8 nchar);
Return value: BOOL
str: char array to store received string
nchar: number of char to receive
Discription: uart2(S2) receive n character & store in str
Example:
Uart2_RecString(cmstr, 8);
***********************************************************************/
BOOL Uart2_RecString(BYTE* str, ui8 nchar);
/***********************************************************
Function: Uart2_RecStrTillEof(BYTE* str);
Return value: BOOL
str: char array to store received string
Discription: S2 receive character continue ,till received Eof
Example:
ui8 mstr[20];
Uart2_RecStrTillEof(mstr);
***********************************************************************/
BOOL Uart2_RecStrTillEof(BYTE* str);
///Uart S3//
#define UART3_MODESEL_VBAUD_8BITS() {S3SM0 = 0;}
#define UART3_MODESEL_VBAUD_9BITS() {S3SM0 = 1;}
#define UART3_MODESEL(selMode) {S3SM0 = ((selMode) >> 1)&0x01;} //selMode type:UART_MODE
/***********************************************************************/
#define UART3_PINSEL_P00P01() {S3_S = 0;}
#define UART3_PINSEL_P50P51() {S3_S = 1;}
#define UART3_PINSEL(selPins) {S3_S = (selPins);} //selPins type:s PIN_GROUP
/***********************************************************************/
#define UART3_BGTIMERSEL_T2() {S3ST3 = 0;}
#define UART3_BGTIMERSEL_T3() {S3ST3 = 1;}
#define UART3_BGTIMERSEL(selT3) {S3ST3 = (selT3);} //selT3 type:BOOL
/***********************************************************************/
#define UART3_RESETRI() {S3RI = 0;}
#define UART3_RESETTI() {S3TI = 0;}
#define UART3_CLEARFLAG() {S3RI = 0; S3TI = 0;}
/***********************************************************
Function: Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT3, ui32 baudrate);
Return value: void
mode: uart3 work mode
pGroup: uart3 pin group
selT3: 1-select T3 as baudrate generator, 0-T2 as baudrate generator
Discription: uart3(s3) init
Example:
Uart3_Init(VBAUD_8BITS, G1, 0, 9600);
***********************************************************************/
void Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT3, ui32 baudrate);
/***********************************************************
Function: Uart3_SendByte(char mData);
Return value: void
mData: byte to send
Discription: send byte by uart3(S3)
Example:
Uart3_SendByte(0xFE);
***********************************************************************/
void Uart3_SendByte(char mData);
/***********************************************************
Function: Uart3_RecByte(BYTE* mchar);
Return value: BOOL
mchar: char variable to store received byte
Discription: S3 receive BYTE data
Example:
char tem;
BOOL mBOOL;
mBOOL= UartS3_RecBYTE(&tem);
***********************************************************************/
BOOL Uart3_RecByte(BYTE* mchar);
/***********************************************************
Function: Uart3_SendString(BYTE* str);
Return value: void
str: char array to store received string
Discription: S3 send string
Example:
UartS3_SendString("Hello world!");
***********************************************************************/
void Uart3_SendString(BYTE* str);
/***********************************************************
Function: UartS3_SendStrAndEof(BYTE* str);
Return value: void
str: char array to store received string
Discription: S3 send string and end flag
Example:
UartS3_SendStrAndEof("Hello world!");
***********************************************************************/
void UartS3_SendStrAndEof(BYTE* str);
/***********************************************************
Function: Uart3_RecString(BYTE* str, ui8 nchar);
Return value: BOOL
str: char array to store received string
nchar: number of receiving char
Discription: S1 receive n character & store in str
Example:
UartS3_RecString(cmstr, 8);
***********************************************************************/
BOOL Uart3_RecString(BYTE* str, ui8 nchar);
/***********************************************************
Function: Uart3_RecStrTillEof(BYTE* str);
Return value: BOOL
str: char array to store received string
Discription: S2 receive character continue ,till received flag of end
Example:
ui8 mstr[20];
Uart3_RecStrTillEof(mstr);
***********************************************************************/
BOOL Uart3_RecStrTillEof(BYTE* str);
///Uart S4//
#define UART4_MODESEL_VBAUD_8BITS() {S4SM0 = 0;}
#define UART4_MODESEL_VBAUD_9BITS() {S4SM0 = 1;}
#define UART4_MODESEL(selMode) {S4SM0 = ((selMode) >> 1);} //selMode type:UART_MODE
//***********************************************************************/
#define UART4_PINSEL_P02P03(){S4_S = 0;}
#define UART4_PINSEL_P52P53(){S4_S = 1;}
#define UART4_PINSEL(selPins) {S4_S = (selPins);} //selPins type:PIN_GROUP
/***********************************************************************/
#define UART4_BGTIMERSEL_T2() {S4ST4 = 0;}
#define UART4_BGTIMERSEL_T4() {S4ST4 = 1;}
#define UART4_BGTIMERSEL(selT4) {S4ST4 = (selT4);} //selT4 type: BOOL
/***********************************************************************/
#define UART4_RESETRI() {S4RI = 0;}
#define UART4_RESETTI() {S4TI = 0;}
#define UART4_CLEARFLAG() {S4RI = 0; S4TI = 0;}
/***********************************************************
Function: Uart4_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT4, ui32 baudrate);
Return value: void
Discription: uart4(s4) init
Example:
UartS4_Init(VBAUD_8BITS, G1, 0, 9600);
***********************************************************************/
void Uart4_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT4, ui32 baudrate);
/***********************************************************
Function: Uart4_SendByte(BYTE mData);
Return value: void
mData: byte to send
Discription: send BYTE by S1
Example:
Uart4_SendByte(0xFE); //send 0xFE by uart4
***********************************************************************/
void Uart4_SendByte(BYTE mData);
/***********************************************************
Function: Uart4_RecByte(BYTE* mchar);
Return value: BOOL
mchar: variable to store receive char
Discription: uart4(S4) receive BYTE data
Example:
char tem;
BOOL mBOOL;
mBOOL= UartS4_RecByte(&tem);
***********************************************************************/
BOOL Uart4_RecByte(BYTE* mchar);
/***********************************************************
Function: Uart4_SendString(BYTE* str);
Return value: void
str: string to send
Discription: uart4(S4) send string
Example:
Uart4_SendString("Hello world!");
***********************************************************************/
void Uart4_SendString(BYTE* str);
/***********************************************************
Function: Uart4_SendStrAndEof(BYTE* str);
Return value: void
str: string to send
Discription: uart4(S4) send string and end flag
Example:
Uart4_SendStrAndEof("Hello world!");
***********************************************************************/
void UartS4_SendStrAndEof(BYTE* str);
/***********************************************************
Function: UartS4_RecString(BYTE* str, ui8 nchar);
Return value: BOOL
str: char array to store received string
nchar: number of char to receive
Discription: uart4(S4) receive n character & store in str
Example:
Uart4_RecString(cmstr, 8);
***********************************************************************/
BOOL Uart4_RecString(BYTE* str, ui8 nchar);
/***********************************************************
Function: Uart4_RecStrTillEof(BYTE* str);
Return value: BOOL
str: char array to store receive string
Discription: S4 receive character continue ,till received Eof
Example:
ui8 mstr[20];
UartS4_RecStrTillEof(mstr);
***********************************************************************/
BOOL Uart4_RecStrTillEof(BYTE* str);
#endif
源代码
/*STC32G_UART.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu, 07/12/2022
*/
#include "STC32G_UART.h"
///Uart S1//
//***********************************************************
void Uart1_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate)
{
//Uart1_ClearFlag();
TI = 0;
RI = 0;
Uart1_ModeSel(mode);
Uart1_PinSel(pGroup);
switch(pGroup)
{
case G1:
STC32G_P3MODE_BIIO(PIN0|PIN1);
break;
case G2:
STC32G_P3MODE_BIIO(PIN6|PIN7);
break;
case G3:
STC32G_P1MODE_BIIO(PIN6|PIN7);
break;
case G4:
STC32G_P4MODE_BIIO(PIN3|PIN4);
break;
}
Uart1_BGTimerSel(selT2);
REN = 1; //receive enable
if(!selT2)
T1BrOutInit(baudrate);
else
T2BrOutInit(baudrate);
}
//End of Uart1_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT2, ui32 baudrate)
//***********************************************************************
void Uart1_SendByte(BYTE mData)
{
TI = 0;
SBUF = mData;
while(!TI);
//TI = 0;
}
//End of Uart1_SendByte(BYTE mData)
//***********************************************************************
BOOL Uart1_RecByte(BYTE* mchar)
{
u32 i = 0;
RI = 0;
while(!RI)
{
if(i < FOSC/1000)
i++;
else
return 0;
}
*mchar = SBUF;
//RI = 0;
return 1;
}
//End of Uart1_RecByte(BYTE* mchar)
//***********************************************************************
void Uart1_SendString(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart1_SendByte(str[i]);
i++;
}
TI = 0;
EA = tem;
}
//End of Uart1_SendString(BYTE* str)
//***********************************************************************
void Uart1_SendStrAndEof(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart1_SendByte(str[i]);
i++;
}
Uart1_SendByte(0xFF);
TI = 0;
EA = tem;
}
//End of Uart1_SendStrAndEof(BYTE* str)
//***********************************************************************
BOOL Uart1_RecString(BYTE* str, ui8 nchar)
{
ui8 i = 0;
ui8 tem = EA;
memset(str,0,strlen(str));
EA = 0;
while(i < nchar)
{
if(Uart1_RecByte(&str[i]))
i++;
else
{
EA = tem;
return 0;
}
}
RI = 0;
EA = tem;
return 1;
}
//End of Uart1_RecString(BYTE* str, ui8 nchar)
//***********************************************************************
BOOL Uart1_RecStrTillEof(BYTE* str)
{
ui8 i = 0;
ui8 tem = EA;
memset(str,0,strlen(str));
EA = 0;
for(;;)
{
if(Uart1_RecByte(&str[i]))
{
if(str[i] == 0xFF)
break;
else
i++;
}
else
{
EA = tem;
return 0;
}
}
RI = 0;
EA = tem;
return 1;
}
//End of Uart1_RecStrTillEof(BYTE* str)
///Uart S2//
//***********************************************************
void Uart2_Init(UART_MODE mode,PIN_GROUP pGroup,ui32 baudrate)
{
Uart2_ClearFlag();
Uart2_ModeSel(mode);
Uart2_PinSel(pGroup);
switch( pGroup)
{
case G1:
STC32G_P1MODE_BIIO(PIN0|PIN1);
break;
case G2:
STC32G_P4MODE_BIIO(PIN6|PIN7);
break;
}
S2REN = 1; //S2 receive enbale
T2BrOutInit(baudrate);
}
//End of Uart2_Init(UART_MODE mode,PIN_GROUP pGroup,ui32 baudrate)
//***********************************************************************
void Uart2_SendByte(BYTE mData)
{
S2TI = 0;
S2BUF = mData;
while(!S2TI);
//S2TI = 0;
}
//End of Uart2_SendByte(BYTE mData)
//***********************************************************************
BOOL Uart2_RecByte(BYTE* mchar)
{
u32 i = 0;
S2RI = 0;
while(!S2RI)
{
if(i < FOSC/1000) //FOSC was defineed in config.h
i++;
else
return 0;
}
*mchar = S2BUF;
//S2RI = 0;
return 1;
}
//End of Uart2_RecByte(BYTE* mchar)
//***********************************************************************
void Uart2_SendString(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart2_SendByte(str[i]);
i++;
}
S2TI = 0;
EA = tem;
}
//End of Uart2_SendString(BYTE* str)
//***********************************************************************
void Uart2_SendStrAndEof(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart2_SendByte(str[i]);
i++;
}
Uart2_SendByte(0xFF);
S2TI = 0;
EA = tem;
}
//End of Uart2_SendStrAndEof(BYTE* str)
//***********************************************************************
BOOL Uart2_RecString(BYTE* str, ui8 nchar)
{
ui8 tem = EA;
ui8 i = 0;
memset(str,0,strlen(str));
EA = 0;
while(i < nchar)
{
if(Uart2_RecByte(&str[i]))
i++;
else
{
EA = tem;
return 0;
}
}
S2RI = 0;
EA = tem;
return 1;
}
//End of Uart2_RecString(BYTE* str, ui8 nchar)
//***********************************************************************
BOOL Uart2_RecStrTillEof(BYTE* str)
{
ui8 i = 0;
ui8 tem = EA;
memset(str,0,strlen(str));
EA = 0;
for(;;)
{
if(Uart2_RecByte(&str[i]))
{
if(str[i] == 0xFF)
break;
else
i++;
}
else
{
EA = tem;
return 0;
}
}
S2RI = 0;
EA = tem;
return 1;
}
//End of Uart2_RecStrTillEof(BYTE* str)
///Uart S3//
//***********************************************************
void Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT3, ui32 baudrate)
{
Uart3_ClearFlag();
Uart3_ModeSel(mode);
Uart3_PinSel(pGroup);
switch( pGroup)
{
case G1:
STC32G_P0MODE_BIIO(PIN0|PIN1);
break;
case G2:
STC32G_P5MODE_BIIO(PIN0|PIN1);
break;
}
Uart3_BGTimerSel(selT3);
S3REN = 1; //receive enable
if(selT3)
T3BrOutInit(baudrate);
else
T2BrOutInit(baudrate);
}
//End of Uart3_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT3, ui32 baudrate)
//***********************************************************************
void Uart3_SendByte(char mData)
{
S3TI = 0;
S3BUF = mData;
while(!S3TI);
//S3TI = 0;
}
//End of Uart3_SendByte(char mData)
//***********************************************************************
BOOL Uart3_RecByte(BYTE* mchar)
{
u32 i = 0;
S3RI = 0;
while(!S3RI)
{
if(i < FOSC)
i++;
else
return 0;
}
*mchar = S3BUF;
//S3RI = 0;
return 1;
}
//End of Uart3_RecByte(BYTE* mchar)
//***********************************************************************
void Uart3_SendString(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart3_SendByte(str[i]);
i++;
}
S3TI = 0;
EA = tem;
}
//End of Uart3_SendString(BYTE* str)
//***********************************************************************
void UartS3_SendStrAndEof(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart3_SendByte(str[i]);
i++;
}
Uart3_SendByte(0xFF);
S3TI = 0;
EA = tem;
}
//End of UartS3_SendStrAndEof(BYTE* str)
//***********************************************************************
BOOL Uart3_RecString(BYTE* str, ui8 nchar)
{
ui8 tem = EA;
ui8 i = 0;
memset(str,0,strlen(str));
EA = 0;
while(i < nchar)
{
if(Uart3_RecByte(&str[i]))
i++;
else
{
EA = tem;
return 0;
}
}
EA = tem;
return 1;
}
//End of Uart3_RecString(BYTE* str, ui8 nchar)
//***********************************************************************
BOOL Uart3_RecStrTillEof(BYTE* str)
{
ui8 i = 0;
ui8 tem = EA;
memset(str,0,strlen(str));
EA = 0;
for(;;)
{
if(Uart3_RecByte(&str[i]))
{
if(str[i] == 0xFF)
break;
else
i++;
}
else
{
EA = tem;
return 0;
}
}
EA = tem;
return 1;
}
//End of Uart3_RecStrTillEof(BYTE* str)
///Uart S4//
//***********************************************************
void Uart4_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT4, ui32 baudrate)
{
Uart4_ClearFlag();
Uart4_ModeSel(mode);
Uart4_PinSel(pGroup);
switch( pGroup)
{
case G1:
STC32G_P0MODE_BIIO(PIN2|PIN3);
break;
case G2:
STC32G_P5MODE_BIIO(PIN2|PIN3);
break;
}
Uart4_BGTimerSel(selT4);
S4REN = 1; //receive enable
if(selT4)
T4BrOutInit(baudrate);
else
T2BrOutInit(baudrate);
}
//End of Uart4_Init(UART_MODE mode,PIN_GROUP pGroup, BOOL selT4, ui32 baudrate)
//***********************************************************************
void Uart4_SendByte(BYTE mData)
{
S4TI = 0;
S4BUF = mData;
while(!S4TI);
//S4RI = 0;
}
//End of Uart4_SendByte(BYTE mData)
//***********************************************************************
BOOL Uart4_RecByte(BYTE* mchar)
{
u32 i = 0;
ui8 tem = 1;
S4RI = 0;
while(!S4RI)
{
if(i < FOSC)
i++;
else
return 0;
}
*mchar = S4BUF;
//S4RI = 0;
return tem;
}
//End of Uart4_RecByte(BYTE* mchar)
//***********************************************************************
void Uart4_SendString(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart4_SendByte(str[i]);
i++;
}
S4TI = 0;
EA = tem;
}
//End of Uart4_SendString(BYTE* str)
//***********************************************************************
void UartS4_SendStrAndEof(BYTE* str)
{
ui8 tem = EA;
ui8 i = 0;
EA = 0;
while(str[i] != 0)
{
Uart4_SendByte(str[i]);
i++;
}
Uart4_SendByte(0xFF);
S4TI = 0;
EA = tem;
}
//End of UartS4_SendStrAndEof(BYTE* str)
//***********************************************************************
BOOL Uart4_RecString(BYTE* str, ui8 nchar)
{
ui8 tem = EA;
ui8 i = 0;
memset(str,0,strlen(str));
EA = 0;
while(i < nchar)
{
if(Uart4_RecByte(&str[i]))
i++;
else
{
EA = tem;
return 0;
}
}
S4RI = 0;
EA = tem;
return 1;
}
//End of Uart4_RecString(BYTE* str, ui8 nchar)
//***********************************************************************
BOOL Uart4_RecStrTillEof(BYTE* str)
{
ui8 i = 0;
ui8 tem = EA;
memset(str,0,strlen(str));
EA = 0;
for(;;)
{
if(!Uart4_RecByte(&str[i]))
{
if(str[i] == 0xFF)
break;
else
i++;
}
else
{
EA = tem;
return 0;
}
}
S4RI = 0;
EA = tem;
return 1;
}
//End of Uart4_RecStrTillEof(BYTE* str)
现在写一个测试程序将一些字符串发送到,串口助手,看能否发送数据成功。
头文件
/*main.h
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu ,01/27/2023
*/
#ifndef __MAIN_H__
#define __MAIN_H__
#include "myport.h"
#include "mtype.h"
#include "config.h"
#include "STC32G_GPIO.h"
#include "STC32G_UART.h"
char str[25] = "This is uart test";
char str1[25] = "1234567890";
char str2[25] = "ABCDEFGHIJKLMN";
char str3[25] = "abcdefghijklmn";
#endif
源代码:
/*main.c
Designed by Bill Liu
Version 0.0
Modified last by Bill Liu, 01/27/2023
*/
#include "main.h"
void main()
{
SysInit();
Uart1_Init(VBAUD_8BITS,G1, 0, 9600);
while(1)
{
Uart1_SendString(str);
Uart1_SendString("\r\n");
Uart1_SendString(str1);
Uart1_SendString("\r\n");
Uart1_SendString(str2);
Uart1_SendString("\r\n");
Uart1_SendString(str3);
Uart1_SendString("\r\n");
Uart1_SendString(str3);
Uart1_SendString("\r\n");
Uart1_SendString(" ");
Uart1_SendString("\r\n");
}
}
//End of main()
编译结果如下:
先将编译后的程序下载到STC32G12K128单片机,注意在config.h中设置的系统频率为30MHz,如下:
在下载时需设置程序运行时IRC频率为30MHz(否则会导致波特率不正确),如下:
下载结果如下:
打开串口,在串口助手上看到的结果如下:
说明数据发送成功,且数据发送无误。
库函数及验证程序源码下载链接:STC32G系列单片机定时器及串行通信接口函数库(非官方函数库)
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested
最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,
目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方
对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.
有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N
光度学中的能量、通量、出度、照度、强度、亮度参数及其联系光度学中评价光的强弱有两种方式,一种是将光作为电磁波,考察其辐射的能量;另一种是以人眼视觉体验来评价光的强弱。前者被称为辐射量,后者被称为光学量。辐射量包括辐射能、辐通量、辐出量、辐照度、辐强度、辐亮度参数,与之相对应,光学量包括光能量、光通量、光出量、光照度、光强度、光亮度参数。通过该文章的阅读,读者还能掌握光学中的几个单位:流明,勒克斯,坎德拉,尼特的意义以及他们之间的关系。辐射量1.辐射能光以电磁波形式发射、传输或接收的能量。单位:焦耳。2.辐通量单位时间发射、传输和接收的辐射能。单位:瓦特。3.辐出度单位面积的辐射源辐射出的辐通量