RT-Thread在富士通Cortex M3 Easy Kit开发板上的移植(一)见
https://bbs.eeworld.com.cn/thread-330952-1-1.html完成《RT-Thread在富士通Cortex M3 Easy Kit开发板上的移植(一)》后,大家全速运行的时候会发现 显示有些不正常,是移植得的有问题吗?
经过检查和调试,我终于发现问题所在:原来的代码是针对MB9B500,而我们的板子上是MB9B506R。仔细查看两者差别,其中MB9B500是10位ADC,而MB9B506R是12位ADC.再仔细查看相关代码和寄存器定义,发现有两个地方。
1)代码中,ADC需要使能,但没有相关代码。所以在ADC.C中rt_adc_init()函数中增加下面代码。
static rt_err_t rt_adc_init(rt_device_t dev)
{
RT_ASSERT(dev != RT_NULL);
if(!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
/* I/O setting AN08 - P18 */
FM3_GPIO->ADE |= 0x100;
FM3_GPIO->PFR1 = 0x100;
FM3_ADC0->ADCEN |= 0x01; /* A/DC setting */
FM3_ADC0->SCIS1 = 0x01;
FM3_ADC0->ADSS1 = 0x00; /* sampling timming ADST0 */
FM3_ADC0->ADST0 = 0x43;
FM3_ADC0->ADCT = 0x02;
FM3_ADC0->SCCR = 0x10; /* FIFO clear,single mode */
FM3_ADC0->CMPCR = 0x00; /* disable comparator */
/* starting A/DC */
FM3_ADC0->SCCR |= 0x01; /* A/DC start */
dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
}
return RT_EOK;
}
2)MB9B500是10位ADC,而MB9B506R是12位ADC.仔细看ADC相关寄存器,发现 SCFD在MB9B500是16位寄存器,而在MB9B506R中是32位寄存器。并且,ADC转换的值都从最高位开始,所以,原来代码中,娶ADC转换值时 SCFD 要右移6位,而我们板子上的代码需要右移20位。所以在ADC.C中rt_adc_initrt_adc_control()函数中修改下面代码:
static rt_err_t rt_adc_control(rt_device_t dev, rt_uint8_t cmd, void *args)
{
RT_ASSERT(dev != RT_NULL);
switch (cmd)
{
case RT_DEVICE_CTRL_ADC_START:
FM3_ADC0->SCCR |= 0x1;
break;
case RT_DEVICE_CTRL_ADC_RESULT:
while(FM3_ADC0->ADSR & 0x1)
;
*((rt_uint16_t*)args) =
FM3_ADC0->SCFD >> 20; *((rt_uint16_t*)args) = *((rt_uint16_t*)args);
*((rt_uint16_t*)args) = (*((rt_uint16_t*)args)); /* get ad value */
break;
}
return RT_EOK;
}
OK.保存所有文件,REBUILD ALL.下载程序,全速运行。试试吧!
(提醒:下载完成后,不要仿真(速度很馒),重新上电运行才能看到真正的运行情况)