当前位置: 首页 > news >正文

网站建设 百度经验宁波seo在线优化方案公司

网站建设 百度经验,宁波seo在线优化方案公司,东莞长安网站设计,网站建设费用用在官网下载SDK后#xff08;以Mesh SDK为例#xff09;使用Eclipse打开#xff0c;对应MCU的配置文件在app_config_8258.h#xff0c;默认的HCI接口是HCI_USE_NONE#xff0c;如果改成HCI_USE_UART后可以通过串口收发数据#xff0c;此时默认接收函数处理的是以Telink的协…在官网下载SDK后以Mesh SDK为例使用Eclipse打开对应MCU的配置文件在app_config_8258.h默认的HCI接口是HCI_USE_NONE如果改成HCI_USE_UART后可以通过串口收发数据此时默认接收函数处理的是以Telink的协议格式收到的SIG model 命令函数原型为blc_rx_from_uart()这个主要用在Gateway工程中。 8258支持一个串口外设可以不使用HCI_ACCESS宏自己定义串口相关以便于连接其他模块等收发自定义数据。 用户相关的配置可以放在user_app_config.h文件中比如需要定义一下Tx和Rx引脚。 #define UART_TX_PIN UART_TX_PB1 #define UART_RX_PIN UART_RX_PA0串口可以使用的引脚在硬件设计手册中查找。 其次是在user_app.h中定义串口需要的相关结构体和宏定义其中user_uart_data_t结构体为单次DMA接收的数据区内容dma_len必须是4字节在收到数据时表示接收到数据的长度user_uart_que_t为串口数据处理的结构体采用循环队列控制接收和发送里面的rx_irq_cnt和tx_irq_cnt只是用来记录进入中断的次数可以通过BDT工具读取判断是否成功收发数据无实际意义。 #define USER_UART_DATA_LEN 12 #define USER_UART_DMA_LEN 4typedef struct{unsigned int dma_len;unsigned char data[USER_UART_DATA_LEN]; }user_uart_data_t;typedef struct{unsigned char rx_rear;unsigned char rx_front;unsigned char tx_rear;unsigned char tx_front;u16 rx_irq_cnt;u16 tx_irq_cnt;user_uart_data_t *p_rx_buf;user_uart_data_t *p_tx_buf; }user_uart_que_t;另外user_uart_data_t结构体的大小必须是16的整数倍因为在设置接收缓冲的时候会用接收缓冲区的长度除以16。 串口的初始化放在Mesh的初始化函数user_init中 串口相关变量定义 user_uart_data_t user_uart_recv_data[USER_MAX_QUE_LEN]; user_uart_data_t user_uart_trans_data[USER_MAX_QUE_LEN]; user_uart_que_t user_uart_que {0}; const u16 UART_TX_LEN_MAX sizeof(user_uart_data_t);串口的初始化函数原型放在user_app.c中 void user_uart_drv_init(void) {user_uart_que_init();uart_recbuff_init( (unsigned char *)user_uart_recv_data[0], sizeof(user_uart_recv_data), (unsigned char *)user_uart_trans_data[0]);uart_gpio_set(UART_TX_PIN, UART_RX_PIN);uart_reset(); //will reset uart digital registers from 0x90 ~ 0x9f, so uart setting must set after this reset//baud rate: 115200uart_init(30, 8, PARITY_NONE, STOP_BIT_ONE);uart_dma_enable(1, 1); //uart data in hardware buffer moved by dma, so we need enable them firstirq_set_mask(FLD_IRQ_DMA_EN);dma_chn_irq_enable(FLD_DMA_CHN_UART_RX | FLD_DMA_CHN_UART_TX, 1); //uart Rx/Tx dma irq enable }串口接收处理函数通过判断user_uart_que.rx_rear和user_uart_que.rx_front变量是否相等来判断接收缓冲队列中是否有未处理的数据主要更改的是user_uart_que.rx_rear变量由于是循环队列中断处理函数在队列已满时也需要改变user_uart_que.rx_rear的值因此串口接收处理函数中改变user_uart_que.rx_rear的值时需要通过开关中断的方式处理一下。同样串口发送处理函数中是通过user_uart_que.tx_front和user_uart_que.tx_rear的值是否相等来判断是否有待发送的数据同时也要判断一下串口是否空闲。 int user_rx_from_uart (void) {u8 curr_p 0;user_uart_data_t *p_data NULL;uart_ErrorCLR();if(user_uart_que.rx_front ! user_uart_que.rx_rear){u32 r irq_disable();curr_p user_uart_que.rx_rear;user_uart_que.rx_rear (user_uart_que.rx_rear 1) % USER_MAX_QUE_LEN;irq_restore(r);p_data user_uart_recv_data[curr_p];user_recv_data_process(p_data);//对接收到的数据进行处理}return 0; }int user_tx_to_uart (void) {if((user_uart_que.tx_front ! user_uart_que.tx_rear) (!uart_tx_is_busy ())){if(uart_Send(user_uart_trans_data[user_uart_que.tx_rear].data, user_uart_trans_data[user_uart_que.tx_rear].dma_len)){user_uart_que.tx_rear (user_uart_que.tx_rear 1) % USER_MAX_QUE_LEN;}}return 0; }待发送数据入列函数如果有数据需要发送可以通过调用user_uart_que_push函数来入列。 void user_uart_que_push(user_uart_data_t *data) {memcpy((unsigned char *)user_uart_trans_data[user_uart_que.tx_front],(unsigned char *)data,(data-dma_len USER_UART_DMA_LEN));user_uart_que.tx_front (user_uart_que.tx_front 1) % USER_MAX_QUE_LEN;if(user_uart_que.tx_front user_uart_que.tx_rear){user_uart_que.tx_rear (user_uart_que.tx_rear 1) % USER_MAX_QUE_LEN;} }然后在main.c中的irq_uart_handle函数中添加串口的中断处理函数在收到一帧数据时需要设置一下串口DMA接收缓冲的地址指向下一个空闲的数据接收区域这样的话就不用把接收到的数据拷贝到另外的地方这也就是为什么需要用队列的方式接收数据。 在串口中断中主要更改的是串口队列中的user_uart_que.rx_front变量用于指示下一个接收的缓冲区当user_uart_que.rx_front加1和user_uart_que.rx_rear变量相等时意味着接收缓冲区满了接收到的数据一直没有被处理此时user_uart_que.rx_rear变量也要加1也就是覆盖掉最早接收到的数据。 _attribute_ram_code_ void user_irq_uart_handle() {unsigned char irqS reg_dma_rx_rdy0;if(irqS FLD_DMA_CHN_UART_RX) //rx{user_uart_que.rx_irq_cnt;reg_dma_rx_rdy0 FLD_DMA_CHN_UART_RX;user_uart_que.rx_front (user_uart_que.rx_front 1) % USER_MAX_QUE_LEN;if (user_uart_que.rx_rear user_uart_que.rx_front){user_uart_que.rx_rear (user_uart_que.rx_rear 1) % USER_MAX_QUE_LEN;}user_uart_que.p_rx_buf user_uart_recv_data[user_uart_que.rx_front];reg_dma0_addr (u16)((u32)user_uart_que.p_rx_buf);}if(irqS FLD_DMA_CHN_UART_TX) //tx{user_uart_que.tx_irq_cnt;reg_dma_rx_rdy0 FLD_DMA_CHN_UART_TX;} }然后就是在主函数中循环调用串口收发处理函数 void user_main_loop(void) {user_rx_from_uart();user_tx_to_uart(); }在user_app_config.h中补充CB_USER_MAIN_LOOP()宏定义 #define CB_USER_MAIN_LOOP() user_main_loop() #define CB_USER_INIT() user_app_init()至此就可以通过串口收发自定义数据。 如果需要使用串口打印log可以使用模拟串口只能发送打开HCI_LOG_FW_EN宏同时定义一下串口的引脚 #define HCI_LOG_FW_EN 1#if HCI_LOG_FW_EN #define DEBUG_INFO_TX_PIN GPIO_PC2 #define PRINT_DEBUG_INFO 1 #endif 模拟串口的波特率在myprintf.h中设置默认1000000如果接收到的数据乱码可以更换串口或者降低波特率。
http://www.hkea.cn/news/14329128/

相关文章:

  • 东莞网站建设0769dt简历在线编辑免费
  • 网站需要服务器吗?十大免费网页游戏
  • 百度博客网站模板网址seo分析
  • 全国城建中心官方网站想找人做网站怎么了解
  • 常州建设工程交易网站东莞网站建设优化诊断
  • 帝国cms企业网站模板中国建设信息化官网
  • 如何做设计师个人网站视频广告网站
  • 广州网站建设优化公司淄博建设网站
  • 手机网站宽度多少合适临时域名 wordpress
  • 长沙免费网站建站模板建设行政主管部门政务网站
  • 网站名称图标如何做才能显示新手怎么把源码做成软件
  • 怎么给餐饮店做网站网站建设群标签好写什么
  • 东莞做网站优化天助网络松江企业做网站
  • 网站编写软件哈尔滨建工建设集团
  • 手机摄影网站搜索优化seo
  • 网站开发代理商设计企业vi
  • 网站简介模板网站建设深圳官网
  • 百度资源站长平台宁波论坛网站哪个最好
  • 团购网站平台建设沈阳建信建设工程有限公司
  • 梅州建站怎么做域名备案怎么关闭网站
  • 网站关键词优化步骤虚拟网站免费注册
  • 怎样做招聘网站分析移动网站开发 书
  • 网站建设公司怎么宣传网站备案 是域名还是空间
  • 公司网站域名申请上海优质网站seo有哪些
  • 湖北可以做网站方案的公司没有备案的网站百度能收录
  • 鞍山网站设计制作网站网页无法访问 wordpress
  • 惠安建设局网站小程序直播开发教程
  • 班级网站主页设计模板wordpress侧面分类插件
  • 中山 网站建设一条龙网上国网app官方下载
  • 龙岗汤坑社区网站建设视频网站建设解决方案