NRF52840学习历程(三)串口

时间在2021125,寒假放假在家好好学一学

 

开发板:初雪的100出头那块 NRF52840 EVAL KIT

下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器STLINK,DAP不建议用)

版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0

参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图)

nRF5_SDK_17.0.2_d674dde(官方例程)

nRF5_SDK_17.0.0_offline_doc(官方文档)

 

实现功能: 串口通信

   

串口不解释了

先添加文件

大概在

..\..\..\..\..\..\integration\nrfx\legacy\nrf_drv_uart.c

大概在..\..\..\..\..\..\components\libraries\uart\retarget.c

..\..\..\..\..\..\components\libraries\fifo\app_fifo.c

再添加头文件路劲

 

然后添加sdk_config代码

 

然后添加头文件,复制已有的就好

 

代码

#define MAX_TEST_DATA_BYTES     (15U)                /**< max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256                         /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 256                         /**< UART RX buffer size. */

代码

const app_uart_comm_params_t comm_params =
      {
          8, //接收
          6, //发射
          0, //不要硬件控制流,我随便给IO0
          0,
          APP_UART_FLOW_CONTROL_DISABLED, //不要硬件控制流
          false, // 无校验
          NRF_UART_BAUDRATE_115200 //波特率
      };

然后把参数写入到寄存器中

uint32_t err_code;
    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_LOWEST,
                         err_code);
	  

主循环就搞个hello world!

while(1)
	{				
		printf("hello world! \r\n");
		nrf_delay_ms(1000);
	}

这样也行

回显用这个也行

完整代码如下


#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "nrf_drv_gpiote.h"

#include "nrf_uart.h"
#include "app_uart.h"

uint32_t LED0,LED1,LED2,LED3;
uint32_t KEY0,KEY1,KEY2,KEY3;

void KEY_Interrupt(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action);


#define MAX_TEST_DATA_BYTES     (15U)                /**< max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256                         /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 256                         /**< UART RX buffer size. */

void uart_error_handle(app_uart_evt_t * p_event);


/**
 * @brief Function for application main entry.
 */
int main(void)
{
	nrf_drv_gpiote_in_config_t key_ex_config; //按键中断配置用
	
	LED0 =  NRF_GPIO_PIN_MAP(0,13);
	LED1 =  NRF_GPIO_PIN_MAP(0,14);
	LED2 =  NRF_GPIO_PIN_MAP(1,9);
	LED3 =  NRF_GPIO_PIN_MAP(0,16);

	KEY0 =  NRF_GPIO_PIN_MAP(0,11);
	KEY1 =  NRF_GPIO_PIN_MAP(0,24);
	KEY2 =  NRF_GPIO_PIN_MAP(0,20);
	KEY3 =  NRF_GPIO_PIN_MAP(0,17);

	nrf_gpio_cfg_output(LED0);
	nrf_gpio_cfg_output(LED1);
	nrf_gpio_cfg_output(LED2);
	nrf_gpio_cfg_output(LED3);

	nrf_gpio_pin_set(LED0);
	nrf_gpio_pin_set(LED1);
	nrf_gpio_pin_set(LED2);
	nrf_gpio_pin_set(LED3);
	
	nrf_gpio_cfg_input(KEY0,NRF_GPIO_PIN_PULLUP );
	nrf_gpio_cfg_input(KEY1,NRF_GPIO_PIN_PULLUP );
	nrf_gpio_cfg_input(KEY2,NRF_GPIO_PIN_PULLUP );
	nrf_gpio_cfg_input(KEY3,NRF_GPIO_PIN_PULLUP );
	
	nrf_drv_gpiote_init();//启动GPIOTE时钟,可以这么说
	
	key_ex_config.hi_accuracy=false; // 启用低精确度PORT事件
	key_ex_config.pull = NRF_GPIO_PIN_PULLUP ; //上啦
	key_ex_config.sense = NRF_GPIOTE_POLARITY_HITOLO ;//下降沿
	
	nrf_drv_gpiote_in_init(KEY0, &key_ex_config, KEY_Interrupt);
	nrf_drv_gpiote_in_init(KEY1, &key_ex_config, KEY_Interrupt);
	nrf_drv_gpiote_in_init(KEY2, &key_ex_config, KEY_Interrupt);
	nrf_drv_gpiote_in_init(KEY3, &key_ex_config, KEY_Interrupt);

	nrf_drv_gpiote_in_event_enable(KEY0, true);//启动KEY0中断
	nrf_drv_gpiote_in_event_enable(KEY1, true);//启动KEY1中断
	nrf_drv_gpiote_in_event_enable(KEY2, true);//启动KEY2中断
	nrf_drv_gpiote_in_event_enable(KEY3, true);//启动KEY3中断
	
	
	
    const app_uart_comm_params_t comm_params =
      {
          8,
          6,
          0,
          0,
          APP_UART_FLOW_CONTROL_DISABLED,
          false,
          NRF_UART_BAUDRATE_115200
      };
	uint32_t err_code;
    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_LOWEST,
                         err_code);
	  
	uint8_t str[]="hello world!\r\n";
	uint8_t i=0,str1[20];
	while(1)
	{				
//		printf("hello world! \r\n");
		
//		while(str[i]!='\0')
//		{
//			app_uart_put(str[i]);
//			i++;
//		}
//		nrf_delay_ms(1000);
//		i=0;
		
		if( NRF_SUCCESS == app_uart_get(str1))
			printf("%s\r\n",str1);
	}
	
}

void KEY_Interrupt(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	if(KEY0 == pin)
		nrf_gpio_pin_toggle(LED0);
	if(KEY1 == pin)
		nrf_gpio_pin_toggle(LED1);
	if(KEY2 == pin)
		nrf_gpio_pin_toggle(LED2);
	if(KEY3 == pin)
		nrf_gpio_pin_toggle(LED3);
}

void uart_error_handle(app_uart_evt_t * p_event)
{
    if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_communication);
    }
    else if (p_event->evt_type == APP_UART_FIFO_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_code);
    }
}

 

链接:https://pan.baidu.com/s/1MPkbDkGPrZcasqTzNeozhQ 
提取码:ay7a 
复制这段内容后打开百度网盘手机App,操作更方便哦

 

下载的工程放在peripheral这个目录下就好,如果有错误,自己找问题改,别来问我

 

下节讲串口中断方法 明天见, 今天晚上我看会小说,不搞了

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nrf52840是一款功能强大的蓝牙低功耗芯片,具备多种特性,其中之一就是可以驱动多个串口。以下是关于如何使用nrf52840驱动两个串口的说明。 首先,nrf52840具有多个UART接口,每个UART接口都可以用作串口通信。UART是一种通用的异步串行通信协议,常用于与外部设备进行数据传输。nrf52840的UART接口支持多种通信模式和波特率设置,可以根据具体需求进行配置。 为了使用nrf52840的两个串口,我们可以按照以下步骤进行: 1. 确定使用哪两个UART接口作为串口nrf52840通常具有多个UART接口可供选择,根据实际需要,选择两个适合的UART接口作为串口。 2. 根据选定的UART接口,进行引脚配置。每个UART接口需要与芯片的引脚进行连接,将其与外部设备连接起来。可以根据nrf52840的引脚映射表找到相应的引脚连接。 3. 通过编程配置UART接口。使用nrf52840的软件开发工具,如nRF5 SDK或nRF Connect SDK,在代码中配置两个UART接口的工作模式、数据传输参数等。这些配置可以包括波特率、数据位、停止位、校验等。 4. 在程序中通过API使用串口。一旦两个UART接口已经配置好,就可以通过API函数在程序中使用串口进行数据的收发。可以用用于发送和接收数据的API函数,如nrf_uart_tx和nrf_uart_rx等。 总结起来,nrf52840可以通过正确配置和使用多个UART接口来驱动两个串口。首先选择适合的UART接口,然后进行引脚配置,并通过编程设置每个UART接口的工作模式和参数。最后,在程序中使用相应的API函数来进行数据的收发。这样,我们就可以通过nrf52840来同时驱动两个串口了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值