695N开发调试总结
1,关于PWM输出
pwm分定时器pwm输出与电机口mcpwm
①定时器pwm输出默认硬件口与映射方法:
定时器资源:
系统定时器总共有4个,timer0~timer3,其中timer1被用来做系统定时,不能再使用。用户可用timer0,timer2以及timer3,而其中timer0又被用来做遥控的capture,给用户留着的是timer2 timer3,而如果用户使用了hdmi功能会发现,其他timer2,timer3一个被用来做cec的捕捉,一个被用来定时了。timer的功能比较强大,使用不仅消化系统资源增加功耗,有大材小用之嫌,而且timer映射outputchannel有风险,如非必要建议不要用timer来做pwm输出的。
如若timer没有被占用,直接照着寄存器配置pwm输出。
/******************************************************************************//*** \brief timer2 软件pwm初始化* \note* \retval none*******************************************************************************/
void timer2_pwm_init(u32 freq)
{u32 sys_clk = 24000000L;u8 div = 4;u8 prescale = 1;printf("--------for pwm use time2---------\n");SFR(JL_IOMAP->CON3, 24, 4, 14);// set OUTPUTCHANNEL2 outputJL_TIMER2->CON = 0x0000;JL_TIMER2->PRD = sys_clk / (div * freq); // calculate the number by freJL_TIMER2->CON = (prescale << 4) | (1 << 0) | (2 << 2)|(1<<8); // set prescale & choosetimerworkmode & choose oscJL_TIMER2->PWM = 0; // Duty Ratio 0-255
}/******************************************************************************//*** \brief timer2 软件pwm设置占空比* \note* \retval none*******************************************************************************/
void timer2_pwm_duty(u16 duty)
{JL_TIMER2->PWM = (JL_TIMER2->PRD * duty) / USE_DENOMINATOR;// Duty Ratio 0-255
}
配置了timer,并且是timer默认的硬件IO口输出。单单设置了timer还不够,gpio.h中有枚举
enum {CH0_UT0_TX,CH0_UT1_TX,CH0_T0_PWM_OUT,CH0_T1_PWM_OUT,CH0_RTOSH_CLK,CH0_BTOSC_CLK,CH0_PLL_12M,CH0_UT2_TX,CH0_CH0_PWM_H,CH0_CH0_PWM_L,CH0_CH1_PWM_H,CH0_CH1_PWM_L,CH0_CH2_PWM_H,CH0_CH2_PWM_L,CH0_T2_PWM_OUT,CH0_T3_PWM_OUT,CH1_UT0_TX = 0x10,CH1_UT1_TX,CH1_T0_PWM_OUT,CH1_T1_PWM_OUT,CH1_RTOSL_CLK,CH1_BTOSC_CLK,CH1_PLL_24M,CH1_UT2_TX,CH1_CH0_PWM_H,CH1_CH0_PWM_L,CH1_CH1_PWM_H,CH1_CH1_PWM_L,CH1_CH2_PWM_H,CH1_CH2_PWM_L,CH1_T2_PWM_OUT,CH1_T3_PWM_OUT,CH2_UT0_RTS = 0x20,CH2_UT1_TX,CH2_T0_PWM_OUT,CH2_T1_PWM_OUT,CH2_PLNK_SCLK,CH2_BTOSC_CLK,CH2_PLL_24M,CH2_UT2_TX,CH2_CH0_PWM_H,CH2_CH0_PWM_L,CH2_CH1_PWM_H,CH2_CH1_PWM_L,CH2_CH2_PWM_H,CH2_CH2_PWM_L,CH2_T2_PWM_OUT,CH2_T3_PWM_OUT,
};
从上到下分为CH0,CH1,CH2 总共3组channel,这是OUTPUTCHANNEL,每一个timer pwm都需要对应一个outputchannel,设置函数为:
u32 gpio_output_channle(u32 gpio, u32 clk);
以上使用timer2的话:
gpio_output_channle(gpio, CH2_T2_PWM_OUT);
使用OUTPUTCHANNEL2通道,对应gpio就是默认的timer2 pwm硬件输出口。
为何使用channel2而不是channel0?
先看问题:
调试过程中我们发现打印串口是任意选择的,怎么做到的?
映射!
因为channel0被串口打印映射使用了,这里使用channel0当然可以但是串口打印就不能使用了,打印打开的话会发现都是打印乱码。当然这里选择channel1也是可以的。MCPWM映射的原理是用一个需要映射的IO口去绑定另外一个已经有波形输出的硬件IO口从而让需要映射的IO口输出同样的波形。
把timer2的pwm输出映射到了outputchannel2上,至此,gpio_output_channle(gpio, CH2_T2_PWM_OUT);中gpio设置的IO就有pwm输出了。但是发现不仅仅映射的IO口有波形输出,原来的timer硬件io口
如果设置成了输出模式,也会有波形输出。
总之:如果硬件IO口被CPU控制并且设置成输出模式,那么timer pwm对应的硬件IO和映射的IO都会有波形输出。
②电机pwm输出默认硬件口与映射方法:
电机默认的mcpwm输出口直接按sdk配置设置即可输出,这里主要总结mcpwm映射输出方法的实现
mcpwm的映射跟timer一样也只有CH0~CH2总共三组可以映射,就是说只可以映射3个IO,映射到IO的前提是本身已经有pwm波形输出,本身的硬件IO也会输出pwm波形。用到mcpwm映射的地方是芯片本身封装没有绑定出来的mcpwm口通过映射的方法实现pwm。例如6951C已经有mcpwm0~mcpwm5总共6组mcpwm,再用他来映射就没有意义了,mcpwm映射主要用在32脚或者更少脚封装的ic上实现Pwm功能。
一下是实现MCPWM的输出例子:
/******************************************************************************//*** \brief 蓝灯使用mcpwm驱动* \note* \retval none*******************************************************************************/
void led_b_init(void)
{struct pwm_platform_data pwm_b_data;//CH4pwm_b_data.pwm_aligned_mode = pwm_edge_aligned; //边沿对齐pwm_b_data.frequency = 8000; //1KHzpwm_b_data.pwm_ch_num = pwm_ch4; //通道0pwm_b_data.pwm_timer_num = pwm_timer4; //时基选择通道0pwm_b_data.duty = 0; //占空比50%pwm_b_data.h_pin = B_PORT; //没有则填 -1。h_pin_output_ch_num无效,可不配置pwm_b_data.l_pin = -1; //硬件引脚,l_pin_output_ch_num无效,可不配置pwm_b_data.complementary_en = 0; //两个引脚的波形同步mcpwm_init(&pwm_b_data);}/******************************************************************************/
/*** \brief 蓝灯duty设置* \note* \retval none********************************************************************************/
void led_b_duty(u8 *duty)
{#ifdef OUTPUT_REVERSEmcpwm_set_duty(pwm_ch4, pwm_timer4, 0xff - *duty);
#elsemcpwm_set_duty(pwm_ch4, pwm_timer4, *duty);
#endif}
一个使用mcpwm映射的例子是:
在6956c上,没有mcpwmch2的硬件pwm channel,因此可以用映射的方法把mcpwm的channel2映射到任意GPIO口上。
以上总而言之,硬件pwm对应的口和映射的口都会输出pwm波形,这是mcpwm映射和timer pwm映射的不同以及最要注意的地方。
2,BLE
SDK提供了好几个Ble的demo,一般用data trans的demo做app开发,至于其他的BLE技术细节实在太多不是只言片语就可以描述完的,不再这里赘述。
3,串口
串口申请直接通过指针调用申请接口即可。值得注意的是uart_platform_data_t机构体中,rx_cbuf_size成员必须为2的N次幂,否则会注册失败,原因是驱动中接收buffer使用了linux中的kfifo做缓冲器,而kfifo为降低算法复杂度,使用&按位与操作取代取模运算,linux中kfifo的具体实现方法可以自行百度,一种类似于kfifo的缓冲器实现在另一篇博客中也有所陈述,该缓冲器可以直接在695X的SDK上面运行以便实现最常用的生产者消费者模型。
串口驱动存在一个问题是当出现接收overtime中断的时候,寄存器HRXCNT的值并不一定是overtime之前接收的实际长度,分两种情况:如果该值大于等于一个frame_length,那么实际接收的长度是 HRXCNT减去frame_length,否则HRXCNT即为实际长度,因此需要在overtime中断到来的时候做一个判断。
4,关于软件定时器原理
定时器无非是常见的硬件timer,以及软件定时器,这里总结的是sdk提供的sys_timer_add等这些软件定时器的实现方法和用法。
sys_timer_add系统定时器是在操作系统基础上封装的定时器。优先级比较低,无非做到高精度的精确定时,比如fm.c里面fm自动搜台使用的就是该定时器,当使用另外一个优先级更高的定时器sys_hi_timer_add定时1ms不断的刷屏或者其他查询操作的时候会导致fm收台时不断被中断,导致收台效果变差。
在timer.h中各个定时器函数用法:
以sys_timer为例,
sys_timer_add,增加轮询定时器,返回一个u16类型的定时器ID,每次定时时间到之后执行超时服务程序。
sys_timer_del 删除已有的定时器,参数是调用sys_timer_add时返回的定时器ID
sys_timeout_add 增加单次触发定时器,超时服务程序只执行一次后Kill掉
sys_timeout_del 同sys_timer_del
sys_timer_re_run 重新开始计时
sys_timer_set_user_data 传入超时服务程序所需要的参数
5、695X SDK调试技巧及存在的坑
这里所说的坑,并不代表原厂修复过的BUG,到目前为止sdk最新版本为0.1.0。
①reverb功能并没有完善,使用reverb建议 REVERB_MODE_SEL使用ECHO模式,并且关闭REVERB_PARM_FADE_EN
话筒说法开始第一声没有出来,只有回音,需要把干声加大,如下:
② sys_s_hi_timer_add定时器服务程序中不可以切换模式,否则会死机。
③
695N开发调试总结相关推荐
- clion 远程连接linux服务器 开发调试
Linux 配置 为了使用CLion 进行开发调试Linux相关的软件版本推荐如下 Cmake 3.x 以上 gdb 7.8.x 以上 本次配置使用的Linux 版本为Centos 7.4 mini ...
- EZ430 Chronos 如何提高开发调试效率探讨
2019独角兽企业重金招聘Python工程师标准>>> EZ430 Chronos 如何提高开发调试效率探讨 TI的 EZ430 Chronos 开发套件在调试程序时需要把手表拆开, ...
- 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
- Xcode 3.2.5免证书开发调试[转]
转自: http://blog.csdn.net/zhanglei5415/article/details/6214634 Xcode编译遇到过 Code Sign error: a valid p ...
- PHP开发调试环境配置(基于wampserver+Eclipse for PHP Developers )
因为项目需求,需要开发PHP的项目,所以不得不花点时间开始学习PHP,过程非常要抓狂,还没有开始开发已经被一大堆复杂的环境搭建搞疯了 经过多方实验,决定将过程记录下来,也为了让很多跟我一样从零开始学习 ...
- 嵌入式开发调试学习与思考
截至今天,自己负责的一个项目算是告一段落,前前后后5个多月时间. 该项目是对公司设计的基于powerpc的处理器进行FPGA仿真阶段的软件验证,以及bootloader和kernel移植,以便芯片进行 ...
- 【数据平台】Eclipse+Scala远程开发调试关于hostname的问题
1.代码: import org.apache.spark.SparkConf import org.apache.spark.SparkContextobject wc {def main(args ...
- 三、开发调试应用程序
我们今天将使用三种方式,把我们自己写的helloworld程序在开发板上运行起来.分别是以下三种: 借助U盘开发调试应用程序 借助TF卡开发调试应用程序 把程序打包进最小linux文件系统镜像里 一. ...
- 基于Kubernetes1.20.1版本开发调试环境搭建
接下来的一段时间将要学习Kubernetes源码,为了更好的查看源码和调试程序,因此搭建了一个Kubernetes开发调试环境,该环境可以结合断点调试理解代码的运行过程. 准备虚拟机并安装必要软件 $ ...
最新文章
- Spring mvc PostgreSQL 插入timestamp和int8
- LeetCode 面试题 10.02. 变位词组
- hdu 3501 欧拉函数
- Python 字典推导式 - Python零基础入门教程
- 交换机跟计算机系统有关系,网速跟交换机有关系吗
- 带你了解家居智能的心脏:物联网关
- thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期
- 周志华:AAAI 2019论文提交创纪录,达到7745篇
- js-Date()对象,get/setFullYear(),getDay()编程练习
- 异常值检测算法 IsolationForest、EllipticEnvelope、OneClassSVM实践
- tp3.2 实现增删改查
- 免费下载IEEE、SCI论文的网站
- 在两个电子表格中找出相同的姓名
- java雷达_# Java 技术雷达:工具篇
- [转]结婚戒指为什么戴在无名指?
- RDLC报表打印尺寸不匹配的问题
- [译] Python 自动处理 Excel 报表
- 苹果状态栏HTML,iphoneX 适配客户端H5页面的方法教程
- 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】
- Container is running beyond physical memory limits
热门文章
- APP实用开发—自定义加载动画
- CODESOFT6 二维码中追加回车
- 公有ip地址和私有ip地址_如何查找您的私有和公共IP地址
- 阿里云网盘不限速,公测可预约了!
- Redis Cluster集群节点间通信
- Intel D435深度相机“No Frames Received!“问题
- 在 Android 设备上搭建 Web 服务器
- 第七周学习周报20181022-20181028
- PHP实现的敏感词过滤方法
- 【MATLAB教程案例50】通过VisualSFM工具箱提取360度等间隔环绕拍摄得到的图像序列点云数据,并进行目标三维重建matlab仿真