实例介绍
【实例简介】
【实例截图】
【核心代码】
/****************************************Copyright (c)**************************************************** ** ** [艾克姆科技] ** IIKMSIK **--------------File Info--------------------------------------------------------------------------------- ** File name: main.c ** Last modified Date: ** Last Version: ** Descriptions: 使用的SDK版本-SDK_11.0.0 ** **-------------------------------------------------------------------------------------------------------- ** Created by: FiYu ** Created date: 2016-5-19 ** Version: 1.0 ** Descriptions: UART控制指示灯实验 **--------------------------------------------------------------------------------------------------------*/ #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include "app_uart.h" #include "app_error.h" #include "nrf_delay.h" #include "nrf_gpio.h" #include "boards.h" #include "nrf_drv_ppi.h" #include "nrf_drv_timer.h" /* 开发板中LED和串口占用的nRF51822管脚资源 P0.21:输出:驱动指示灯D1 P0.22:输出:驱动指示灯D2 P0.23:输出:驱动指示灯D3 P0.24:输出:驱动指示灯D4 P0.09:UART_TXD :串口发送 P0.11:UART_RXD :串口接收 P0.08:UART_CTS P0.10:UART_RTS 需要短接对应的跳线帽 */ #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */ #define UART_RX_BUF_SIZE 1 /**< UART RX buffer size. */ const nrf_drv_timer_t timer0 = NRF_DRV_TIMER_INSTANCE(0); const nrf_drv_timer_t timer1 = NRF_DRV_TIMER_INSTANCE(1); const nrf_drv_timer_t timer2 = NRF_DRV_TIMER_INSTANCE(2); nrf_ppi_channel_t ppi_channel1, ppi_channel2; 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); } } // Timer even handler. Not used since timer is used only for PPI. void timer_event_handler(nrf_timer_event_t event_type, void * p_context){} /** @brief Function for initializing the PPI peripheral. */ static void ppi_init(void) { uint32_t err_code = NRF_SUCCESS; err_code = nrf_drv_ppi_init();//初始化PPI。检查PPI模块是否已经被初始化,若未初始化,将初始化标志置位 APP_ERROR_CHECK(err_code); // 配置第一个PPI通道(本实验中使用了2个PPI通道)TIMER1 COMPARE[0]匹配事件作为事件端点触发TIMER0计数器的STOP Task(任务端点) err_code = nrf_drv_ppi_channel_alloc(&ppi_channel1);//分配PPI通道,成功分配通道后,ppi_channel1指向被分配的通道 APP_ERROR_CHECK(err_code); // 设置通道的事件端点和任务端点 err_code = nrf_drv_ppi_channel_assign(ppi_channel1, nrf_drv_timer_event_address_get(&timer1, NRF_TIMER_EVENT_COMPARE0), nrf_drv_timer_task_address_get(&timer0, NRF_TIMER_TASK_STOP)); APP_ERROR_CHECK(err_code); // 配置第二个PPI通道(本实验中使用了2个PPI通道)TIMER2 COMPARE[0]匹配事件作为事件端点触发TIMER0计数器的START Task(任务端点) err_code = nrf_drv_ppi_channel_alloc(&ppi_channel2);//分配PPI通道,成功分配通道后,ppi_channel2指向被分配的通道 APP_ERROR_CHECK(err_code); // 设置通道的事件端点和任务端点 err_code = nrf_drv_ppi_channel_assign(ppi_channel2, nrf_drv_timer_event_address_get(&timer2, NRF_TIMER_EVENT_COMPARE0), nrf_drv_timer_task_address_get(&timer0, NRF_TIMER_TASK_START)); APP_ERROR_CHECK(err_code); // 使能两个已经配置了事件端点和任务端点的PPI通道 err_code = nrf_drv_ppi_channel_enable(ppi_channel1); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_enable(ppi_channel2); APP_ERROR_CHECK(err_code); } /** @brief Function for Timer 0 initialization, which will be started and stopped by timer1 and timer2 using PPI. */ static void timer0_init(void) { ret_code_t err_code = nrf_drv_timer_init(&timer0, NULL, timer_event_handler); APP_ERROR_CHECK(err_code); } /** @brief Function for Timer 1 initialization. * @details Initializes Timer 1 peripheral, creates event and interrupt every 2 seconds, * by configuring CC[0] to timer overflow value, we create events at even number of seconds * for example, events are created at 2,4,6 ... seconds. This event can be used to stop Timer 0 * with Timer1->Event_Compare[0] triggering Timer 0 TASK_STOP through PPI. */ static void timer1_init(void) { // Configure Timer 1 to overflow every 2 seconds. Check TIMER1 configuration for details // The overflow occurs every 0xFFFF/(SysClk/2^PRESCALER). // = 65535/31250 = 2.097 sec ret_code_t err_code = nrf_drv_timer_init(&timer1, NULL, timer_event_handler); APP_ERROR_CHECK(err_code); nrf_drv_timer_extended_compare(&timer1, NRF_TIMER_CC_CHANNEL0, 0xFFFFUL, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false); } /** @brief Function for Timer 2 initialization. * @details Initializes Timer 2 peripheral, creates event and interrupt every 2 seconds * by configuring CC[0] to half of timer overflow value. Events are created at odd number of seconds. * For example, events are created at 1,3,5,... seconds. This event can be used to start Timer 0 * with Timer2->Event_Compare[0] triggering Timer 0 TASK_START through PPI. */ static void timer2_init(void) { // Generate interrupt/event when half of time before the timer overflows has past, that is at 1,3,5,7... seconds from start. // Check TIMER1 configuration for details // now the overflow occurs every 0xFFFF/(SysClk/2^PRESCALER) // = 65535/31250 = 2.097 sec */ ret_code_t err_code = nrf_drv_timer_init(&timer2, NULL, timer_event_handler); APP_ERROR_CHECK(err_code); nrf_drv_timer_extended_compare(&timer2, NRF_TIMER_CC_CHANNEL0, 0x7FFFUL, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false); } //串口初始化 void uart_init(void) { uint32_t err_code; //配置串口 const app_uart_comm_params_t comm_params = { RX_PIN_NUMBER, //设置UART的管脚 TX_PIN_NUMBER, RTS_PIN_NUMBER, CTS_PIN_NUMBER, APP_UART_FLOW_CONTROL_DISABLED, //关闭流控 false, UART_BAUDRATE_BAUDRATE_Baud115200 //设置波特率为115200 }; APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_error_handle, APP_IRQ_PRIORITY_LOW, err_code); APP_ERROR_CHECK(err_code); } /********************************************************************************************** * 描 述 : main函数 * 入 参 : 无 * 返回值 : 无 ***********************************************************************************************/ int main(void) { LEDS_CONFIGURE(LEDS_MASK); //配置驱动LED指示灯的管脚 LEDS_OFF(LEDS_MASK); //关闭所有指示灯 timer0_init(); // 初始化Timer0用作计数器 timer1_init(); // 初始化Timer1用作定时器,偶数秒产生匹配事件 timer2_init(); // 初始化Timer2用作定时器,奇数秒产生匹配事件 ppi_init(); // 初始化PPI uart_init(); //初始化串口。波特率115200,流控关闭 // Enabling constant latency as indicated by PAN 11 "HFCLK: Base current with HFCLK // running is too high" found at Product Anomaly document found at // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads // // @note This example does not go to low power mode therefore constant latency is not needed. // However this setting will ensure correct behaviour when routing TIMER events through // PPI (shown in this example) and low power mode simultaneously. NRF_POWER->TASKS_CONSTLAT = 1; // Start clock. nrf_drv_timer_enable(&timer0);//使能Timer0 nrf_drv_timer_enable(&timer1);//使能Timer1 nrf_drv_timer_enable(&timer2);//使能Timer2 while (true) { printf("Current count: %d\r\n", (int)nrf_drv_timer_capture(&timer0,NRF_TIMER_CC_CHANNEL0));//打印出Timer0计数值 nrf_drv_timer_increment(&timer0);//计数器Timer0计数值加1 nrf_delay_ms(100); nrf_gpio_pin_toggle(LED_1);//翻转指示灯D1的状态,用于指示程序的运行 } } /********************************************END FILE*******************************************/
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论