目录
1 串口引脚配置
我板子上有个zig_tx和rx接在串口1上,所以就使用他来进行串口示例。其中RX为PB1,TX为PB0.
打开pintool。准备配置串口1。
将PB0配置成如下图。
同样PB1配置成如下图.
在driver目录下,新建两个文件。
2 串口代码编写
这里借鉴了(39条消息) ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-5-02:串口发送数据-hello world_拿破仑940911的博客-CSDN博客
我也是在这里面学习,然后记录一下自己的学习过程,大家如果感兴趣的画也可以加入对应的qq群。
usart.c代码编写。
#include "usart.h"
#include "em_cmu.h"
#include "em_usart.h"
uint8_t my_usart1_rx_buf[MY_USART1_RX_MAX];
uint16_t my_usart1_rx_len = 0;
sl_zigbee_event_t my_usart1_event;
void my_usart1_event_handler(sl_zigbee_event_t *event)
{
my_usart1_rx_callback(my_usart1_rx_buf, my_usart1_rx_len);
memset(my_usart1_rx_buf, 0x00, my_usart1_rx_len);
my_usart1_rx_len = 0;
}
void MY_USART1_RX_IRQ_HANDLER(void)
{
my_usart1_rx_buf[my_usart1_rx_len++] = USART_Rx(MY_USART1);
sl_zigbee_event_set_delay_ms(&my_usart1_event, MY_USART1_RX_TIMEOUT);
}
void my_usart1_init(uint32_t baudrate)
{
// Enable clock to GPIO
CMU_ClockEnable(cmuClock_GPIO, true);
// Configure the USART TX/RX pin
GPIO_PinModeSet(MY_USART1_TX_PORT, MY_USART1_TX_PIN, gpioModePushPull, 0);
GPIO_PinModeSet(MY_USART1_RX_PORT, MY_USART1_RX_PIN, gpioModeInput, 0);
// Route MY_USART1 TX and RX to the board controller TX and RX pins
GPIO->USARTROUTE[MY_USART1_NUM].TXROUTE = (MY_USART1_TX_PORT << _GPIO_USART_TXROUTE_PORT_SHIFT) | (MY_USART1_TX_PIN << _GPIO_USART_TXROUTE_PIN_SHIFT);
GPIO->USARTROUTE[MY_USART1_NUM].RXROUTE = (MY_USART1_RX_PORT << _GPIO_USART_RXROUTE_PORT_SHIFT) | (MY_USART1_RX_PIN << _GPIO_USART_RXROUTE_PIN_SHIFT);
GPIO->USARTROUTE[MY_USART1_NUM].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;
// Configure and enable MY_USART1
USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;
init.baudrate = baudrate;
init.databits = MY_USART1_DATA_BITS;
init.parity = MY_USART1_PARITY;
init.stopbits = MY_USART1_STOP_BITS;
init.oversampling = MY_USART1_OVER_SAMPLING;
init.hwFlowControl = MY_USART1_HW_FLOW_CONTROL;
USART_InitAsync(MY_USART1, &init);
// Enable NVIC USART sources
NVIC_ClearPendingIRQ(MY_USART1_RX_IRQ_N);
NVIC_EnableIRQ(MY_USART1_RX_IRQ_N);
// Enable receive data valid interrupt
USART_IntEnable(MY_USART1, USART_IEN_RXDATAV);
}
void my_usart1_send_byte(uint8_t byte)
{
USART_Tx(MY_USART1, byte);
}
void my_usart1_send_buf(uint8_t *buf, uint16_t len)
{
uint16_t i;
for(i=0; i<len; i++)
{
USART_Tx(MY_USART1, buf[i]);
}
}
int my_usart1_printf(const char* format, ...)
{
char buf[MY_USART1_PRINT_MAX] = {0x00};
va_list va;
int ret;
va_start(va, format);
ret = vsprintf(buf, format, va);
va_end(va);
my_usart1_send_buf((uint8_t *)buf, strlen((const char *)buf));
return ret;
}
WEAK(void my_usart1_rx_callback(uint8_t *buf, uint16_t len))
{
}
usart.h代码编写。
/*
* usart.h
*
* Created on: 2023年5月9日
* Author: 31382
*/
#ifndef MY_CODE_DRIVER_USART_H_
#define MY_CODE_DRIVER_USART_H_
#include "app/framework/include/af.h"
#include "pin_config.h"
#define MY_USART1 USART1
#define MY_USART1_NUM 1
#define MY_USART1_TX_PORT U1_TX_PORT
#define MY_USART1_TX_PIN U1_TX_PIN
#define MY_USART1_RX_PORT U1_RX_PORT
#define MY_USART1_RX_PIN U1_RX_PIN
#define MY_USART1_RX_MAX 500
#define MY_USART1_RX_IRQ_N USART1_RX_IRQn
#define MY_USART1_RX_IRQ_HANDLER USART1_RX_IRQHandler
#define MY_USART1_RX_TIMEOUT 10
#define MY_USART1_DATA_BITS usartDatabits8
#define MY_USART1_PARITY usartNoParity
#define MY_USART1_STOP_BITS usartStopbits1
#define MY_USART1_OVER_SAMPLING usartOVS16
#define MY_USART1_HW_FLOW_CONTROL usartHwFlowControlNone
#define MY_USART1_PRINT_MAX 300
extern uint8_t my_usart1_rx_buf[MY_USART1_RX_MAX];
extern uint16_t my_usart1_rx_len;
extern sl_zigbee_event_t my_usart1_event;
extern void my_usart1_event_handler(sl_zigbee_event_t *event);
void my_usart1_init(uint32_t baudrate);
void my_usart1_send_byte(uint8_t byte);
void my_usart1_send_buf(uint8_t *buf, uint16_t len);
int my_usart1_printf(const char* format, ...);
void my_usart1_rx_callback(uint8_t *buf, uint16_t len);
#endif /* MY_CODE_DRIVER_USART_H_ */
编译一下。如果报错的话,到sclp文件,搜索VCOM,把他删了就行了。
随后到mycodespace.c文件中将该代码粘贴到该文件。
#include "mycodespace.h"
#include "af-main.h"
#include "sl_simple_led_instances.h"
#include "../driver/mykey.h"
#include "../driver/usart.h"
void emberAfMainInitCallback(void)
{
my_usart1_init(115200);
my_usart1_printf("usart1 is ok!");
}
3 示例观察
随后将数据线连接板子和电脑。需要注意的是这个开发板有两个USB接口,我们需要接下面那个。就可以看到串口1,输出的信息。多按几次复位按钮,就可以多次观察。