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开发调试总结相关推荐

  1. clion 远程连接linux服务器 开发调试

    Linux 配置 为了使用CLion 进行开发调试Linux相关的软件版本推荐如下 Cmake 3.x 以上 gdb 7.8.x 以上 本次配置使用的Linux 版本为Centos 7.4 mini ...

  2. EZ430 Chronos 如何提高开发调试效率探讨

    2019独角兽企业重金招聘Python工程师标准>>> EZ430 Chronos 如何提高开发调试效率探讨 TI的 EZ430 Chronos 开发套件在调试程序时需要把手表拆开, ...

  3. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  4. Xcode 3.2.5免证书开发调试[转]

    转自:  http://blog.csdn.net/zhanglei5415/article/details/6214634 Xcode编译遇到过 Code Sign error: a valid p ...

  5. PHP开发调试环境配置(基于wampserver+Eclipse for PHP Developers )

    因为项目需求,需要开发PHP的项目,所以不得不花点时间开始学习PHP,过程非常要抓狂,还没有开始开发已经被一大堆复杂的环境搭建搞疯了 经过多方实验,决定将过程记录下来,也为了让很多跟我一样从零开始学习 ...

  6. 嵌入式开发调试学习与思考

    截至今天,自己负责的一个项目算是告一段落,前前后后5个多月时间. 该项目是对公司设计的基于powerpc的处理器进行FPGA仿真阶段的软件验证,以及bootloader和kernel移植,以便芯片进行 ...

  7. 【数据平台】Eclipse+Scala远程开发调试关于hostname的问题

    1.代码: import org.apache.spark.SparkConf import org.apache.spark.SparkContextobject wc {def main(args ...

  8. 三、开发调试应用程序

    我们今天将使用三种方式,把我们自己写的helloworld程序在开发板上运行起来.分别是以下三种: 借助U盘开发调试应用程序 借助TF卡开发调试应用程序 把程序打包进最小linux文件系统镜像里 一. ...

  9. 基于Kubernetes1.20.1版本开发调试环境搭建

    接下来的一段时间将要学习Kubernetes源码,为了更好的查看源码和调试程序,因此搭建了一个Kubernetes开发调试环境,该环境可以结合断点调试理解代码的运行过程. 准备虚拟机并安装必要软件 $ ...

最新文章

  1. Spring mvc PostgreSQL 插入timestamp和int8
  2. LeetCode 面试题 10.02. 变位词组
  3. hdu 3501 欧拉函数
  4. Python 字典推导式 - Python零基础入门教程
  5. 交换机跟计算机系统有关系,网速跟交换机有关系吗
  6. 带你了解家居智能的心脏:物联网关
  7. thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期
  8. 周志华:AAAI 2019论文提交创纪录,达到7745篇
  9. js-Date()对象,get/setFullYear(),getDay()编程练习
  10. 异常值检测算法 IsolationForest、EllipticEnvelope、OneClassSVM实践
  11. tp3.2 实现增删改查
  12. 免费下载IEEE、SCI论文的网站
  13. 在两个电子表格中找出相同的姓名
  14. java雷达_# Java 技术雷达:工具篇
  15. [转]结婚戒指为什么戴在无名指?
  16. RDLC报表打印尺寸不匹配的问题
  17. [译] Python 自动处理 Excel 报表
  18. 苹果状态栏HTML,iphoneX 适配客户端H5页面的方法教程
  19. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】
  20. Container is running beyond physical memory limits

热门文章

  1. APP实用开发—自定义加载动画
  2. CODESOFT6 二维码中追加回车
  3. 公有ip地址和私有ip地址_如何查找您的私有和公共IP地址
  4. 阿里云网盘不限速,公测可预约了!
  5. Redis Cluster集群节点间通信
  6. Intel D435深度相机“No Frames Received!“问题
  7. 在 Android 设备上搭建 Web 服务器
  8. 第七周学习周报20181022-20181028
  9. PHP实现的敏感词过滤方法
  10. 【MATLAB教程案例50】通过VisualSFM工具箱提取360度等间隔环绕拍摄得到的图像序列点云数据,并进行目标三维重建matlab仿真