




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中电港钟志峰BDF008-DA14681如何在休眠状态下正常接收到串口数据文档版本:V0.0.1使用过DA14681的朋友一定知道,在芯片进入低功耗模式后,串口的接收就会有问题,往往会出现数据丢包的情况(程序被设定为收到数据立即转发):11 54:2C.LI 54:22.5TE:l 154: 23. 12411:54: £3. £1B23. &58:11 :54:2j. T05.11:4: 33. &4 7TAI 4681 VAKTIQ CAKGei VAKT!OHello DAI 4661 VAKT'QSkHellQ BAI4SBI VAST!DA
2、I 46S1 UAKT! 口At唱"阴 4561 WT!sleep芯片在ddtVE状态下丁每一个发岀去的数据包都能祓返回25旦芯片进入休眠状 态,大多数数据都无法正常返回11 S4:37.BA14SB1 UAKT! O11 54:36 161TO-K>Hdlo DAI 4861 UAKT 口 11 S4:38. 754*g-OMaid IM40Bi HAM IO 11 54:38.441®-n>HaUo DAI 45B1 UAKT! 口 ;tl 54:56 535收*-H«lLo DAI4661 VAST! :54:4C. 15re->OHall
3、Q Udi4661 VAKTIDI 11 :5理:4D. TE刃麦gjggj 1TART!D那么,问题来了,如果要保证所有上位机发送过来的数据都能被DA14681接收到,那岂不是要一直让 DA14681处于active状态呢?这样,低功耗蓝牙的意 义又何在?答案当然是否定的,聪明的读者应该已经想到了,可以让上位机需要发送数 据的时候,想办法先告诉 DA14681 “我要发送数据了,请准备好”。本文所作的 工作就是告诉你如何来唤醒 DA14681,方法有两种,一个是利用第三个10 口来 唤醒DA14681,也就是整个UART通信需要用三根线:RX,TX,INT第二种就是只 用RX,TX两根线。最
4、终达到的目的就是:12:10:33.78B收cKi p ac weFiz: 10:39. 279 :12: 10:39. 372' ;12:10:33 B69: :12:10'39 773 :12: 10:39. 934: '12: 10:39.g65d '12:10:40. 137 J1Z:1O:«. 1B6;12:10 :40. 355;12:10:40.464EMWlSA14GS1 DAl4681 DA14&31DA14B81 DAI 4631 DA14G31 DA14681DA1U&.1 DA14&81Ji5r|a在需要
5、发送数据前先唤醍 牆若口 DA 14681.WI! WAIT! If AIT! UA1T! UJCETIDUART i同时,在正常状态下的平均功耗也是可以接受的(200多uA是由于程序还 在发广播):InfoPealc Current (mA)31 58281Avg Current (mA) 。左了范3 JCharge (uC)4242.90315-Extended n trol接下去我们来一步步说明如何来添加代码,基础代码我们依旧选择DA1468x_SDK_BTLE_v_1.0.8.1050的 pxp_reporter 例子,工具为 Smartsnippets Studio v1.4.3.7
6、72。注意,代码只是教你使用方法,真正应用到工程中还需要进一步优化。一,三线方法(TX,RX,INT首先,我们打开Smartsnippets Studio工具,然后导入工程,并添加两个空白 文件 uart_task.c 和 uart_task.h:11_f=0 回 Includestonfigb 日 DA145S1 -01- Rel se.QS PIp & Idcripts> C® misu> q> tS startup卜园main.eb 园 pxp_re po rt er_ta sk. c回 sw_yer5ion. IiA 园 U 吕匚| 卜 i,h| y
7、ai_t曰wk,h;"J' initiaLflash.bat这两个文件作为我们UART TAS使用,先放着备用接下去,我们在custom_config_qspi.h文件中添加几个宏定义:国 uarltask.e 田 mainx custom conFg qspi.Ji#defint dg config.MVPAR ADAPTERKdefint dgonfi&GPADC AOAPTER11Sifdef TalkBT UAR.T ADAPTER TASK TESTdefine dg configJSE Hl-J JAkT1#define dgconfigUWRT ADAP
8、TER1flendif#ifdef TslkBT_UART_ADPTER_TA5K_TE5Tefine dg_configU5E_HWJJART1define dg_configUART_ADAPTER1_ iendif#ifdef TalkBT_UART_ADAPTER_TASK_TEST#define dg_c on figUSE_HW_UART1#define dg_co nfigUART_ADAPTER1#en dif这两个定义的作用是打开 UART ADAPTE功能,因为我们这里要用到uart控 制台。然后在文件最上面添加以下两个定义:1.爲 uartjtask.c卫 min.c1
9、日nfiq5pi.h 坯ittfndef CUSTCHCOtJFIG_QSPI_Hitdefine CUSTaa_COIdFIG_Q5PI_Hinclude "b5p_definition5#defire TalkBT_UART_ADAPTEfi_7ASIC_TEST ttdefine 匚OM尸工(i一枪RE.厅Lb¥_DETE£pdefine CONFIG_USE_9LE#defi ne TalkBT_UART_ADAPTER_TASK_TEST#defi ne CONFIG_UART_IGNORE_BUSY_DETECT再找到以下位置,将其修改为零:园 uar
10、tjakiCLd mainiClhh| custom.config.qspi-h 吃dg configlMAGE ETJPDEVELOPMEMTJIODE#deflne dgconfigEWULATE_OTP_COPY(0)#define dgconfigJSERCANUSEIMERl(0)冋严h Controls the ttRAM size ue豐ct by the project.* 0: all R/y4 i£ retained* 1: retention nencry iize is aptim2|ttdefine pr®j configVPTimiJRETRW8
11、) I#if ! defined(;RELEASE_BLHLD)(pro j_confi&OPTIMAL_F<ETRAM 1) 严 14ARNIN-G: retRA/1 optimizations are disabled in DEBIM builds! #undef t>roi confieOPTLW RETRAH#defi ne proj_co nfigOPTIMAL_RETRAM(0)随后,打开main.c添加以下代码:i c| uart_ta&k.tLH miri.c 圏 |h| cu5tQm_fQnfig_q5pLh#include "bltm
12、gr,h"#include "hw cp<i_h'p ttinclude " hw_gp£cih"#include '*sy5_elorlc_mgr. h" ffimrlude ,Fsy5_power_mgr. h" #include ,Fsys_Latchdog nh"#include Mplatforffi_devices.h,T#i4def Talk盯JAR_ADAPTER_TA5K_TF£T #include 'artask.h" ffemdif#ifdef
13、 TalkBT_UART_ADAPTER_TASK_TEST#in clude "uart_task.h"#en dif然后在systemnit函数中添加初始化代码:回 uarttask.c 园 mainx £3 剧 cus+om config qspi.he t_s leepmodefextended sLeep);/ f pm_s 61_£ 1 ee p_n*od e ( pm_iriod e_a ct i ve);/" Initialize BLE rianager */ ble_ingr_inlt ():#ifde-F 7alkBTJJ
14、ART_ADAPTER_TASK:_TE5T duartinitf); createuarttask()#cndi-f严 Start the PKP reporter application tsk." OS_TAK_CPEATE("PXP Repo#ifdef TalkBT_UART_ADAPTER_TASK_TESTad_uart_ in it();create_uart_task();#en dif在periphnit函数中添加串口初始化代码:|3 Lart_t35kh h clstcspi +1回 Fmj n,c 左 hj plarfonn_dpvke£.
15、h - _J . 二 一 = .童 7= -*hw_gp ro_r UNC_UAnii_tx); hwjp io_i etin fu nction(Hi 3>I0 POItr a f mi fiPIO PlN Sj HhL$Pm_N06fc_ftJ亍WT _HW_GPra_nJI4C_UJRT?_RM);#Hdef TalkST_UAFl7_MAP TEfL_TA£ K_TESThw_gpio_conf±gure_pLn(riUft!_2t 卢吐护丄出_10_x10Dt_LU PLitt_giV_F'dFiL_30 盯; hw pdo set pin fun=
16、tion(M/ GPIO FORT lt 昭 GPJO PIN 冇 吊 GPJOQUTPiJTt-mu_ sp io_ Fuwc_miTFj_ nQ jhw_§pia_2et-pin.-funzti<jnIT_2p 4WPlN_3t CPIO !OQE WV,沖匹* U/iL_UAftI2_ itjij iHendiF#ifdef TalkBT UART ADAPTER TASK TEST hw gpio co nfigure pi n(HW GPIO PORT 2, HW GPIO PIN 3, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_GPIO,
17、1);HW_GPIO_FUNC_UART2_RX);#en dif除了这里,还有一个地方需要配置,很明显,这里是配置UART口的参数的, 默认有UART1和UART2我们这里使用的是UART2并使用其默认值:nJ stern| 国 pl迪 main.c -£| pip_rpQrt?r_t3 eIgitincJucJefrifeef _cpluspluilextern F" fSendlf樹 dgconf i gUART ADAP"E RUART BUSCUBTl h CHIALX . HW_UAflT QAUDRArE 山躍MT盟TTS B,帀 MRT PARIT
18、Y 阿Hh_UAFlT_5TQP0:T5_l. 6b &» ttU_QHA_CL_L. hfei_D_CtWJNfL_6乳 町U曲 l_ELi£U=HTl htRXALj HV!_U/.R' _BAUDRAI E_LLS200> l-lJ_JflliT DAABITS_匕上 Hk_LAkT_kH2 ' ,*_r.LUNLJ Hd UART S TOPB lTS_lf&, 1?d_D_CHAWJE 匚器 G/GJU&niif P ci_ccnfigL'AR'_ADAPTt:R f接下去,我们来编辑最重要的代码,即u
19、art_task.h和uart_task.c,首先是uart_task.h:c mart taIc.c|.ti uarl takh 淫UART_T/<5K_t1define UART_TA5K_Hinclude <stdbool.h>extern void 匚reate_uar七_七日01( (woiti) jftendif /* UART_TASK_H_ r/#ifndef UART_TASK_H_ #defi ne UART_TASK_H_#in elude <stdbool.h>exter n void create_uart_task(void);#en
20、dif /* UART_TASK_H_ */头文件的代码很简单,就是申明了一个task创建函数,也就是前面systemnit 函数中所调用的函数。接下去是uart_task.c,由于代码比较长,就不截图了,直接全部复制过来, 相应的解释也直接看代码的注释吧:#i nclude<stdbool.h>#i nclude<stri ng.h>#i nclude"osal.h"#i nclude"ble_att.h"#i nclude"ble_commo n.h"#i nclude"ble_gap.h&quo
21、t;#i nclude"ble_gatts.h"#i nclude"ble2cap.h"#i nclude"util/list.h"#i nclude"bas.h"#i nclude"ias.h"#i nclude"lls.h"#i nclude"tps.h"#i nclude"sys_power_mgr.h"#i nclude"sys_socf.h"#i nclude"ad_ nvparam.h"
22、;#i nclude"ad_battery.h"#i nclude"hw_breath.h"#i nclude"hw_gpio.h"#in clude"hw_wkup.h"#i nclude "hw_led.h"#in elude "sys_watchdog.h"#i nclude "platform _n vparam.h"#in clude "pxp_reporter_c on fig.h"#i nclude "ble_s
23、torage.h"#i nclude "platform_devices.h"#in clude "uart_task.h"#define MAX_UART_SIZE 100/定义收发缓存最大长度,可根据需求修改char read_buffMAX_UART_SIZE; /UART 接收数据缓存uint32_tread_len=0;/接收到的有效数据长度char write_buffMAX_UART_SIZE; /UART 发送数据缓存uint32_twrite_len=0;/ 发送数据长度char read_temp; /存放读到的第一个数据u
24、art_device uart_dev; / 定义 UART设备bool keep_alive=false;/ 系统当前是否为 active 状态staticuint8_tactive_loop=0; /这个用于计算进入休眠的时间,当然也可以改成用定时器的方式,这样更准确bool uart_ready_falg=true;/ 当前 uart 是否准备好标志/串口读取完成回调函数,每收到一个字节系统会跳转到此函数staticvoid uart_read_cb (void *user_data,uint16_ttransferred)read_buffread_le n=read_temp;rea
25、d_le n+;if (readen=MAX_UART_SIZE)readen=MAX_UART_SIZE-1;/将当前读到的字节存放完毕后,在此启动异步读取 uart数据,回调函数依然为uart_read_cbad_uart_read_as yn c(uart_dev,&read_temp, 1, uart_read_cb, NULL);/串口发送完成回调函数staticvoid uart_write_cb (void *user_data,uint16_ttransferred)write_len=0;/发送完毕后将write_len 清零/io口中断函数staticvoidwku
26、p_ha ndler()hw_wkup_reset_cou nter(); hw_wkup_reset_i nterrupt();if (!keep_alive)10 口中断产生后,强制不让系统进入休眠keep_alive=true;pm_stay_alive();active_loop=0;/系统在active 状态下不在需要10 口中断,故暂时关闭中断hw_wkup_co nfigure_p in(HW_GPI0_P0RT_1 HW_GPI0_PIN_6,0, HW_WKUP_PIN_STATE_LOW uart_ready_falg=true;/解除“强制不让系统进入休眠“函数stati
27、cvoid set_sys_mode_sleep ad_uart_write(uart_dev,/重新注册I0 口中断hw_wkup_c on figure_p in(void )"chip sleepn", 11);HW_GPI0_P0RT_1HW_GPI0_PIN_6,1, HW_WKUP_PIN_STATE_L0W if (keep_alive)/允许系统进入休眠keep_alive=false; pm_resume_sleep();* 函数名称:task_uart_func*描述:uart task 函数* 输入:*pvParameters*输岀:None*返回:N
28、one*/staticvoidtask_uart_fu nc(void *pvParameters)#define MAX_ACTIVE_L00P 100/ 定义进入休眠时间 ,这里 100*0S_DELAY_MS(50)=5 秒/以下注册P16为低电平中断HW_GPI0_P0RT_1 HW_GPI0_PIN_6,hw_wkup_i nit(NULL); hw_gpio_set_p in_fun cti on(HW_GPI0_M0DE_INPUT_PULLUPHW_GPI0_FUNC_GPI0;hw_wkup_c on figure_pi n(HW_GPIO_PORT_1 HW_GPIO_PI
29、N_6,1, HW_WKUP_PIN_STATE_LOWhw_wkup_set_cou nter_threshold(1);hw_wkup_set_debou nce_time(10);hw_wkup_register_ in terrupt(wkup_ha ndler, 1);uart_dev = ad_uart_open(SERIAL2);/ 打开串口 devicead_uart_read_async(uart_dev,&read_temp, 1, uart_read_cb, NULL);/ 设置读取一个字节for (;)/ad_uart_bus_acquire(uart_dev)
30、;/告诉上位机UART已经准备好if (uart_ready_falg)uart_ready_falg=false;ad_uart_write(uart_dev,"chip activen",12);if (read_len>0 && write_len=0)/如果检测到读到的数据不为零,并且当前正没有数据在发送,则往UART口发送已收到的数据memcpy(write_buff,read_buff,read_le n);write_le n=read_le n;read_le n=0;ad_uart_write_as yn c(uart_dev,wri
31、te_buff,write_le n,uart_write_cb, NULL);active_loop=0;else /如果RX没有收到数据,则进入休眠倒计时if (active_loop < MAX_ACTIVE_LOOP)active_loop+;if (active_loop = MAX_ACTIVE_LOOP)set_sys_mode_sleep();/设置系统允许进入休眠ad_uart_bus_release(uart_dev);OS_DELAY_MS(50);ad_uart_close(uart_dev);* 函数名称:create_uart_task*描述:创建uart t
32、ask*输入:None*输岀:None*返回:None*/(void )void create_uart_taskOS_TASK han dle;OS_TASK_CREATE( "uart_task" , the task, fordebugkern el. */task_uart_fu nc,task. */(void * ) 0,task. */512,OS_TASK_PRIORITY_NORMAL,task. */han dle);OS_ASSERT(ha ndle);/* The text n ame assig ned toonly; not used by th
33、e/* The fun cti on that impleme nts the/* The parameter passed to the/* The priority assigned to the/* The task han dle. */代码如果看不清楚,可以新建一个 c文件,然后拷贝进去,用编辑器查看即 可。代码中的逻辑大致是这样:串口引脚为 P13(TX),P23(RX)唤醒引脚为P16低电平唤醒;正常工作模式(保持active状态)串口监听RX管脚数据一旦收到数据通过TX 管脚将数据回发;如果5秒钟RX没有收到数据,则进入休眠状态;如果需要发送数据,则首选需要将P16拉低(给一个
34、下降沿脉冲即可,不需要全 程拉低),系统会重新进入active状态。随后,我们编译测试:tr tr - . n-runr jr* r-13:29:50. 206 收+ chij ac t ive:15:29:53. 125:13:2953 15613:29:53.827:l:29:53.83O:1;29;5A,576:13:29:54.60T: 13:29:59.459is总lib MU&SL mT!C *-Mello DA146C1 VAET! -+OHtllo DA146i UAET! 口 h*ho dak6«i mi!-OHsIIqUAHT! 口Hsll & D
35、AI 461 UUIT!*令uhi,l:30'13:3013:3015:3002:. 30002.571'03.495'06. 10B'2-OHello RA146C1 mi! 克亠0矗11。HA14BC1 VAETIC OM&no DA146C1 irmin13:30:07,61日13:30:07.682i3:3D:oa.zeo13:30:08.30613:30:Oa.-94513:30:08.992!-+OHtllo-OHello Hsll Ortello He HoW4&C1DA146S1DAK6C1DA146S1DA146S1HA146S
36、1UAET!口j能正常收发VUIT!iruiTinITAET!上电后系统处于目dtivm状态"收发 正常系统休眠后,收发不正常拉低 P1® 唤 0IDA14681补充一点,如果编译结果出现以下报错:Desch ptionResourceJ G Errors (2 items£3 Symbol 'SER1AL2' could not be resolved uart_task.c''J Type 'uart.device' could not be resolved uartjtak.c请做以下操作,再编译:,两线方法
37、(RX,TX当然,以上做法有一个明显的缺陷,就是需要额外的一个io 口(P16),这样会有局限性,如果能只用 RX和TX实现此功能,那岂不快哉。所以,接下去我们来用代码实现,先讲一下大致逻辑:串口引脚为 P13(TX) P23(RX)正常工作模式(保持active状态)串口监听RX管脚数据,一旦收到数据通过TX 管脚将数据回发;如果5秒钟RX没有收到数据,则进入休眠状态,进入休眠状态之前把 RX口 设置为普通10 口和低电平中断;如果需要发送数据,上位机需要通过UART口给DA14681发送一个数据(这边 测试发送十六进制的00 00,能够唤醒),由于RX口设置成了低电平中断,一旦 DA146
38、81被唤醒后,在中断函数中会关闭 RX唤醒功能并且重新配置为 UART功 能,随后DA14681被设置为active状态,并向UART发送"chip active"以通知上位 机UART已经能正常工作。代码的话,只需要在先前三线代码基础上改动以下几个地方即可:将static void wkup_handler()函数中的以下代码删除:/系统在active状态下不在需要IO 口中断,故暂时关闭中断hw_wkup_co nfigure_p in (HW_GPIO_PORT_1, HW_GPIO_PIN_6,0,HW_WKUP_PIN_STATE_LOW);并换成:/系统在act
39、ive状态下,重新配置P23为RX端口,以便接收数据hw_wkup_co nfigure_pi n(HW_GPIO_PORT_2, HW_GPIO_PIN_3,0,HW_WKUP_PIN_STATE_LOW);hw gpio set pin function(HW GPIO PORT 2, HW GPIO PIN 3,HWGPIO MODE INPUTHW_GPIO_FUNC_UART2_RX);然后将static void set_sys_mode_sleep(void函数中的以下代码删除:7重新注册IO 口中断hw wkup con figure pi n(HW GPIO PORT 1,
40、HW GPIO PIN 6,1,HW WKUP PIN STATELOW);并换成:/配置P23(RX)口为普通IO 口并且配置为低电平触发中断hw_wkup_i nit(NULL);hw_gpio_set_pin_fu nctio n(HW_GPIO_PORT_2, HW_GPIO_PIN_3,HW_GPIO_MODE_INPUT_PULLU,PHW_GPIO_FUNC_GPIO);hw_wkup_co nfigure_pi n(HW_GPIO_PORT_2, HW_GPIO_PIN_3,1,HW_WKUP_PIN_STATE_LOW);hw_wkup_set_co un ter_thres
41、hold(1);hw_wkup_set_debo un ce_time(0);hw_wkup_register_ in terrupt(wkup_ha ndler, 1);最后删除以下代码:static void task_uart_func(void pvParameters) -#dcfine MAX_ACTIVE_La)P 10G “定义进入依眠时间,10e*OS_JELAY_M&(5e)-5秒/F以下注低电平中師h_wkLfp_init(NUL_);hw_gp io set_p in f u n c t io n ( HVJj PIO PGR T_1, HW GPIO PIN
42、fiP 1D_MOOE_INPUT_PU 1_HW_GP IO_FUMC_C PIO);hw_wkup.®nfigure_pin(HW_CP工。-切前_ 1HW_GPIOPIM_S, 1Hk_WICUP_PIIM_5TATE_0W); hw_wk up_set_cg u n te r_t h re s ho1d(1);hw_wkup_set_debounce_timetl®);hw_Hkup_register_inte rrupt(wlcup-h5rcller» 1) j|uart_dev ad_uart_open(SERIAL2);/tT开串口device ad
43、jjart_read_async(uart_devJiread_teffipJ 1, d3rt_read_cb, NULL);.'/设置谟取一f 宝节 forf为了方便,还是将uart_task.c的内容贴出来:#i nclude<stdbool.h>#i nclude<stri ng.h>#i nclude"osal.h"#i nclude"ble_att.h"#i nclude"ble_commo n.h"#i nclude"ble_gap.h"#i nclude"bl
44、e_gatts.h"#i nclude"ble2cap.h"#i nclude"util/list.h"#i nclude"bas.h"#i nclude"ias.h"#i nclude"lls.h"#i nclude"tps.h"#i nclude"sys_power_mgr.h"#i nclude"sys_socf.h"#i nclude"ad_ nvparam.h"#i nclude"ad_
45、battery.h"#i nclude"hw_breath.h"#i nclude"hw_gpio.h"#i nclude"hw_wkup.h"#i nclude"hw_led.h"#i nclude"sys_watchdog.h"#i nclude"platform _n vparam.h"#i nclude"pxp_reporter_con fig.h"#i nclude"ble_storage.h"#i nclude&q
46、uot;platform_devices.h"#in clude"uart task.h"#define MAX_UART_SIZE 100/定义收发缓存最大长度,可根据需求修改char read_buffMAX_UART_SIZE; /UART 接收数据缓存uint32_tread_len=0;/接收到的有效数据长度char write_buffMAX_UART_SIZE; /UART 发送数据缓存uint32_twrite_len=0;/ 发送数据长度char read_temp; /存放读到的第一个数据uart_device uart_dev; / 定义 U
47、ART设备bool keep_alive=false;/ 系统当前是否为 active 状态static uint8_t active_loop=0; /这个用于计算进入休眠的时间,当然也可以改成用定时器的方式,这样更准确bool uart_ready_falg=true;/ 当前 uart 是否准备好标志/串口读取完成回调函数,每收到一个字节系统会跳转到此函数staticvoid uart_read_cb (void *user_data, uint16_t transferred)read_buffread_le n=read_temp;read_le n+;if (readen=MAX_
48、UART_SIZE)readen=MAX_UART_SIZE-1;/将当前读到的字节存放完毕后,在此启动异步读取 uart数据,回调函数依然为uart_read_cbad_uart_read_as yn c(uart_dev,&read_temp, 1, uart_read_cb, NULL);/串口发送完成回调函数staticvoid uart_write_cb (void *user_data,uint16_ttransferred)write_len=0;/发送完毕后将write_len 清零/中断函数staticvoid wkup_ha ndler ()hw_wkup_rese
49、t_cou nter();hw_wkup_reset_i nterrupt();if (!keep_alive)/IO 口中断产生后,强制不让系统进入休眠keep_alive=true;pm_stay_alive();active_loop=0;/系统在active 状态下,重新配置P23为RX端口,以便接收数据hw_wkup_configure_pin(HW_GPIO_PORT_2 HW_GPIO_PIN_3,0, HW_WKUP_PIN_STATE_LOWHW_GPIO_PORT_2 HW_GPIO_PIN_3,hw_gpio_set_p in_fun cti on(HW_GPIO_MOD
50、E_INPUTHW_GPI0_FUNC_UART2_RXuart_ready_falg=true;staticvoid set_sys_mode_sleep (void ) ad_uart_write(uart_dev."chip sleepn", 11);/配置P23(RX) 口为普通IO 口并且配置为低电平触发中断hw_wkup_i nit(NULL);hw_gpio_set_p in_fun cti on(HW_GPIO_PORT_2 HW_GPIO_PIN_3,HW_GPIO_MODE_INPUT_PULLUPHW_GPIO_FUNC_GPIO;hw_wkup_co
51、nfigure_pin(HW_GPIO_PORT_2 HW_GPIO_PIN_3,1, HW_WKUP_PIN_STATE_LOW hw_wkup_set_cou nter_threshold(1); hw_wkup_set_debou nce_time(0);hw_wkup_register_ in terrupt(wkup_ha ndler, 1);if (keep_alive)/允许系统进入休眠keep_alive=false; pm_resume_sleep();/* 函数名称:task_uart_func*描述:uart task 函数* 输入:*pvParameters*输岀:No
52、ne*返回:None*/staticvoidtask_uart_fu nc(void *pvParameters)#define MAX_ACTIVE_LOOP 100/ 定义进入休眠时间 ,这里 1OO*OS_DELAY_MS(5O)=5 秒/打开串口 deviceuart_dev = ad_uart_ope n(SERIAL2);ad_uart_read_async(uart_dev,&read_temp, 1, uart_read_cb, NULL);/ 设置读取一个字节for (;)ad_uart_bus_acquire(uart_dev);/告诉上位机UART已经准备好if (uart_ready_falg)uart_ready_falg=false;ad_uart_write(uart_dev,"chip activen",12);if (read_len>0 && write_len=0)/如果检测到读到的数据不为零,并且当前正没有数据在发送,则往UART口发送已收到的数据memcpy(write_buff,read_buff,read_le n);write_le n=read_le n;read_le n=0;ad_uart_write_as yn c(uart_dev,write_buff,wr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 毒品预防教育4
- 2025年全国中小学校青少年禁毒知识竞赛复习题库及答案(共390题)
- 2025一级建造师考试《工程管理与实务》章节题合同管理
- 河北省衡水市郑口中学2024-2025学年高二下学期开学检测语文试题
- laslk手术合同范例
- 2025环卫工作鞋采购合同
- 公共贴砖合同范例
- 2025瑞泽文化传播公司广告制作合同样本
- 2025 年家电采购合同协议书范本
- 京东服装租赁合同标准文本
- 部编版语文教材培训讲座-口语交际
- 二年级数学有余数的除法(2位数除以1位数)竞赛试题练习题
- 同等学力英语申硕考试词汇(第六版大纲)电子版
- 初中数学基于核心素养导向的大单元教学设计(共50张)
- 附录6眼保健操图解
- run@rate表格实例
- 2020年江西省南昌市中考真题物理
- 《模具电火花加工》PPT课件.ppt
- 烟气超低排放改造和增设脱硝项目资金申请报告写作模板定制
- 数学分析2期末考试题库(1)28页
- 25HZ轨道电路
评论
0/150
提交评论