HG-STM32LIB开源项目讨论一:串口及寄存器定义标准
class USART{
int baut;
int port;
public:
void init(const char s[8],int baut_set);
void TxChar(char c);
void TxString(char s[]);
};
对于串口,想写一个类。初始化时,参数类似"COM1",38400
波特率可随意设置,比如115200也是可以的
对于嵌入式处理器,多个串口,每个串口用COM1、COM2、COM3来表示。
如果要用COM1,则如下定义
USART usart1;
usart1.init("COM1",115200);
使用的时候如下:
usart1.TxChar('A');
usart1.TxString("Hellognss!");
定义的对象名称可以随意,例如:
USART com2;
com2.init("COM2",9600);
接口部分主要的设计思想是提供一个基本够用的简单接口。
发送的确容易封装,接收不好弄,嵌入式里,接收通常可以在中断里直接取寄存器,或者在定时器中断里查询。
先发一个STM32开源项目的寄存器定义
//======================USART1 register====================
#define USART1_BASE 0x40013800
#define USART1_SR (*((volatile unsigned*)0x40013800))
#define USART1_DR (*((volatile unsigned*)0x40013804))
#define USART1_BRR (*((volatile unsigned*)0x40013808))
#define USART1_CR1 (*((volatile unsigned*)0x4001380C))
#define USART1_CR2 (*((volatile unsigned*)0x40013810))
#define USART1_CR3 (*((volatile unsigned*)0x40013814))
#define USART1_GTPR (*((volatile unsigned*)0x40013818))
当然这个还不是最关键的,我们的STM32开源项目还有一个位域定义:
struct SUSART_CR1
{
unsigned SBK:1;
unsigned RWU:1;
unsigned RE:1;
unsigned TE:1;
unsigned IDLEIE:1;
unsigned RXNEIE:1;
unsigned TCIE:1;
unsigned TXEIE:1;
unsigned PEIE:1;
unsigned PS:1;
unsigned PCE:1;
unsigned WAKE:1;
unsigned M:1;
unsigned UE:1;
unsigned res1:18;
};
union UUSART_CR1
{
struct SUSART_CR1 r;
unsigned a;
};
利用联合体+位域来实现对寄存器特定位的操作。用的时候通常按下面的方式操作:
UUSART_CR1 usart1_cr1;
usart1_cr1.a=USART1_CR1;
usart1_cr1.r.UE=1;
usart1_cr1.r.TE=1;
usart1_cr1.r.RE=1;
usart1_cr1.r.RXNEIE=1;
USART1_CR1=usart1_cr1.a;
虽然指令比直接赋值多了,但是可读性会好很多。
HG-STM32开源项目将为懒人提供一个基本不用改动的接口,简单调用便可操作外设,也将为聪明人提供容易修改的源代码,如果你又懒又聪明,用这套代码就再合适不过了!
页:
[1]