返回列表 回复 发帖

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开源项目将为懒人提供一个基本不用改动的接口,简单调用便可操作外设,也将为聪明人提供容易修改的源代码,如果你又懒又聪明,用这套代码就再合适不过了!
返回列表