本帖最后由 数码小叶 于 2023-4-5 14:39 编辑
在华芯微特的官网资料里-‘库函数&例程’,可以下到一个SWM341_Lib,解压后每个模块的工程文件,可以直接用keil打开。
遗憾的是在库中没有找到API的帮助文档,因此只能通过例程来熟悉了。
串口的初始化函数
UART_InitStructure UART_initStruct;
PORT_Init(PORTM, PIN0, PORTM_PIN0_UART0_RX, 1);
PORT_Init(PORTM, PIN1, PORTM_PIN1_UART0_TX, 0);
UART_initStruct.Baudrate = 115200;
UART_initStruct.DataBits = UART_DATA_8BIT;
UART_initStruct.Parity = UART_PARITY_NONE;
UART_initStruct.StopBits = UART_STOP_1BIT;
UART_initStruct.RXThreshold = 3;
UART_initStruct.RXThresholdIEn = 0;
UART_initStruct.TXThreshold = 3;
UART_initStruct.TXThresholdIEn = 0;
UART_initStruct.TimeoutTime = 10;
UART_initStruct.TimeoutIEn = 0;
UART_Init(UART0, &UART_initStruct);
UART_Open(UART0);
从串口的初始化操作中可以看出来,底层寄存器已经封装好成库函数了和宏定义了,方便调用
尤其是PORT_Init函数,即使一次用,也很直观明白
华芯微特已经在库里把每个管脚的功能已经全部定义出来了,调用时显得更加简单明了,几乎不用去查看datesheet了,只需要查看SWM341_port.h文件。
相比配置PORTx_SEL0/PORTx_SEL1,省了很多事。
同样,串口的初始化结构体UART_InitStructure定义也很直观明了,都有注释,看了一些其他的结构体定义,同样如此
typedef struct {
uint32_t Baudrate;
uint8_t DataBits; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
uint8_t Parity; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、 UART_PARITY_ZERO
uint8_t StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
uint8_t RXThreshold; //取值0--7
uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
uint8_t TXThreshold; //取值0--7
uint8_t TXThresholdIEn; //当TX FIFO中数据个数 <= TXThreshold时触发中断
uint8_t TimeoutTime; //超时时长 = TimeoutTime/(Baudrate/10) 秒
uint8_t TimeoutIEn; //超时中断,超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
} UART_InitStructure;
最后是printf重定向,直接调用串口打印
int fputc(int ch, FILE *f)
{
UART_WriteByte(UART0, ch);
while(UART_IsTXBusy(UART0));
return ch;
}
通过SWDM-QFP100-34SVEA3的原理图,可以发现,CH340C的串口出来后,RX和TX没有和板子的其他部分连接,而是引出了两个排针位置Tx/Rx
为了和库例程保持一致,使用UART0,因此用杜板线把TX\RX 和 M0\M1引脚连接起来。
打开串口助手,成功输出数据,串口工作ok
在看库函数操作时,发现一个不同于一般库操作的地方
GPIO_initStruct.func = 0; //引脚功能为GPIO
GPIO_initStruct.dir = 1; //输出
GPIO_initStruct.pull_up = 0;
GPIO_initStruct.pull_down = 0;
GPIO_initStruct.open_drain = 0;
GPIO_Init(GPIOA,PIN_2,&GPIO_initStruct); //GPIOA.2初始化为输出引脚,无上拉、无下拉、非开漏
上拉、下拉、开漏居然是每个都有一个配置??
在GPIO_Init函数里是具体的赋值操作if(pull_up == 1) PORTx->PULLU |= (1 << n);
else PORTx->PULLU &= ~(1 << n);
if(pull_down == 1) PORTx->PULLD |= (1 << n);
else PORTx->PULLD &= ~(1 << n);
if(open_drain == 1) PORTx->OPEND |= (1 << n);
else PORTx->OPEND &= ~(1 << n);
果然也是并列关系,万一管脚很多或者某些原因,发生了错误的配置,不知道三个中哪一个会起效果。
综合体验下来,SWM341的库写的还是很通俗易用,方便新手上手。
|