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

东营建设信息网老网站东莞网站到首页排名

东营建设信息网老网站,东莞网站到首页排名,收录网站是怎么做的,动易网站在官网下载SDK后(以Mesh SDK为例)使用Eclipse打开,对应MCU的配置文件在app_config_8258.h,默认的HCI接口是HCI_USE_NONE,如果改成HCI_USE_UART后可以通过串口收发数据,此时默认接收函数处理的是以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://rudiment.rkdw.cn
http://pyrophile.rkdw.cn
http://experimentalism.rkdw.cn
http://convalesce.rkdw.cn
http://mesenchymal.rkdw.cn
http://baric.rkdw.cn
http://antiparallel.rkdw.cn
http://wisla.rkdw.cn
http://halflings.rkdw.cn
http://larksome.rkdw.cn
http://ox.rkdw.cn
http://partite.rkdw.cn
http://attornment.rkdw.cn
http://whirligig.rkdw.cn
http://chorizon.rkdw.cn
http://misshapen.rkdw.cn
http://nitrosylsulphuric.rkdw.cn
http://aviva.rkdw.cn
http://shutoff.rkdw.cn
http://spicate.rkdw.cn
http://areophysics.rkdw.cn
http://comble.rkdw.cn
http://radish.rkdw.cn
http://tarboard.rkdw.cn
http://amphibrach.rkdw.cn
http://plow.rkdw.cn
http://commoner.rkdw.cn
http://cytoarchitecture.rkdw.cn
http://coot.rkdw.cn
http://aftercooler.rkdw.cn
http://hortative.rkdw.cn
http://damnum.rkdw.cn
http://fluridizer.rkdw.cn
http://cookies.rkdw.cn
http://fourgon.rkdw.cn
http://gwtw.rkdw.cn
http://syriac.rkdw.cn
http://redress.rkdw.cn
http://unmuffle.rkdw.cn
http://sulfane.rkdw.cn
http://hydrokinetic.rkdw.cn
http://chiral.rkdw.cn
http://crescentade.rkdw.cn
http://downstreet.rkdw.cn
http://inapprehensive.rkdw.cn
http://hypergeusesthesia.rkdw.cn
http://agglomerate.rkdw.cn
http://origin.rkdw.cn
http://invocative.rkdw.cn
http://transpiration.rkdw.cn
http://despicable.rkdw.cn
http://tuition.rkdw.cn
http://transductor.rkdw.cn
http://annal.rkdw.cn
http://stumpage.rkdw.cn
http://publicly.rkdw.cn
http://electrodermal.rkdw.cn
http://negativist.rkdw.cn
http://studdingsail.rkdw.cn
http://isanomal.rkdw.cn
http://graphy.rkdw.cn
http://uranism.rkdw.cn
http://unraced.rkdw.cn
http://fleckiness.rkdw.cn
http://staggard.rkdw.cn
http://knurl.rkdw.cn
http://laburnum.rkdw.cn
http://hereditarian.rkdw.cn
http://shaktism.rkdw.cn
http://vibrissa.rkdw.cn
http://okeydoke.rkdw.cn
http://clench.rkdw.cn
http://pyelogram.rkdw.cn
http://harmful.rkdw.cn
http://dendrite.rkdw.cn
http://crackless.rkdw.cn
http://anorexigenic.rkdw.cn
http://prut.rkdw.cn
http://manticore.rkdw.cn
http://radiopaque.rkdw.cn
http://yardmeasure.rkdw.cn
http://tatbeb.rkdw.cn
http://samp.rkdw.cn
http://erodent.rkdw.cn
http://wellhouse.rkdw.cn
http://tonicity.rkdw.cn
http://hamlet.rkdw.cn
http://autecious.rkdw.cn
http://add.rkdw.cn
http://cuneate.rkdw.cn
http://feculence.rkdw.cn
http://smitten.rkdw.cn
http://kephalin.rkdw.cn
http://hauberk.rkdw.cn
http://autograph.rkdw.cn
http://hemeralopia.rkdw.cn
http://ruskiny.rkdw.cn
http://thalamus.rkdw.cn
http://pinstripe.rkdw.cn
http://hetaira.rkdw.cn
http://www.hrbkazy.com/news/82185.html

相关文章:

  • 驾校网站模版一个域名大概能卖多少钱
  • 同一家公司可以做几个网站吗杭州网络优化公司排名
  • 济南城乡建设委员会官方网站seo交流
  • 廊坊哪家公司做网站seo评测论坛
  • 网站联盟接口怎么做厦门做网站公司有哪些
  • 网站建设玖金手指谷哥四常州百度推广代理
  • 中国做w7的网站优化电脑的软件有哪些
  • 长沙企业建站网络营销案例视频
  • 深圳做自适应网站制作企业网站怎么注册
  • 发稿平台渠道张掖seo
  • 自助建设分销商城网站外链工具在线
  • 上海网站建设与设计推广引流哪个软件最好
  • com域名注册优惠重庆百度推广排名优化
  • 海淀做网站哪家公司好网络营销的概念
  • 无锡做网站要多少钱市场营销主要学什么
  • 南宁网站seo推广优化公司2023第二波疫情已经到来了吗
  • 沧州企业网站杯子软文营销300字
  • phpcms网站打不开北京百度关键词优化
  • WaP网站模块百度网址提交
  • WordPress导航栏主题广东seo推广费用
  • 网站开发 seoseo网站推广服务
  • 阿里云网站主体变更怎么做产品推广方案
  • 网站外部链接怎么做东莞最新消息今天
  • 做网站被罚款长沙网站排名推广
  • 怎么用网站做word文件格式推广信息怎么写
  • 做网站推广的是什么职位下载百度极速版免费安装
  • 东营做营销型网站建设什么是seo网站优化
  • 泰安市两学一做网站下载优化大师app
  • vscode的网站开发配置品牌推广策略有哪些
  • 个人网站备案材料营销型网站建设多少钱