SimplicityStudio_v5.6.4.0+efr32mg21 学习笔记(4) 串口使用

目录

1 串口引脚配置

 2 串口代码编写

3 示例观察


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,输出的信息。多按几次复位按钮,就可以多次观察。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值