本帖最后由 chinesebear 于 2015-9-14 20:56 编辑
龙芯智龙开发板教程rtt for smart loong:链接
关于智龙开发板的PWM驱动For RT-ThreadPWM driver for RTT on Smart Loong Board
由于没有示波器,智能通过万用测电压的方式来检测PWM驱动的正确性。 Step1硬件连接。Loongson 1C一共有四个PWM,其中PWM0和PWM1可以直接使用,PWM2和PWM3需要复用其它脚。万用表的表笔用鳄鱼夹夹在PWM0的输出。 通过下图可以查到PWM0的位置:下一排插座的序号17处(看引脚说明)。
step2 驱动软件。为了适应RT-Thread的IO驱动管理的机制,龙芯的四个PWM的驱动都注册到了IO驱动管理层。为了调试方便,我在finsh中添加了pwm_control(pwm, HRC, LRC)命令。通过“FINSH_FUNCTION_EXPORT()”将“pwm_control()”添加到RTT的shell中。 int pwm_control(rt_uint32_t pwm_num, rt_uint32_t HRC_value, rt_uint32_t LRC_value) {
char* pwm_str[4] ={"pwm0","pwm1","pwm2","pwm3"}; rt_uint32_t pwm_buffer[2]={HRC_value,LRC_value}; rt_uint32_t pwm_base = 0; rt_uint32_t *base_ptr = RT_NULL; //rt_kprintf("pwm device = %s \n",pwm_str[pwm_num]); rt_device_t pwm_dev=rt_device_find(pwm_str[pwm_num]); if (pwm_dev == RT_NULL) { rt_kprintf("Don't find pwm device:%s \n", pwm_str[pwm_num]); return RT_NULL; }else{ rt_kprintf("Find pwm device:%s \n", pwm_str[pwm_num]); } base_ptr = (rt_uint32_t *)(pwm_dev->user_data); pwm_base = *base_ptr; rt_kprintf("pwm device base addr = 0x%8X \n", pwm_base); rt_device_open(pwm_dev,RT_DEVICE_FLAG_RDWR); rt_kprintf("Open pwm device completed \n");
rt_device_control(pwm_dev,PWM_SET_HRC, &pwm_buffer[0]); rt_device_control(pwm_dev,PWM_SET_LRC, &pwm_buffer[1]); rt_kprintf("Set HRC= %d, LRC= %d \n", HRC_value,LRC_value); return RT_EOK; } FINSH_FUNCTION_EXPORT(pwm_control, pwm control(PWM,HRC,LRC)); Step3 测试结果从下图可以看出,在脉冲占空比不断增加的同时,PWM输出电压也线性增大,这可以说明PWM的驱动是正确的。 Step4 总结智龙主板的驱动会逐步健全。由于智龙开发板是为工控、物联网等硬实时要求比较高场合而设计,所以我将会为 RT-Thread移植更多的驱动和程序。下一个添加的驱动是GPIO。希望通过我所做的事情能够激发大家开发龙芯的热情。诸君共勉! 附件RTT的elf文件:
|