【瑞萨RA4E1评估板】keil项目和ADC测试
[复制链接]
FPB-RA4E1板子的MCU RA4E1是Arm® Cortex®-M33 内核的芯片,那么就可以使用keil工具来开发项目,但是keil的官方资料不是很多,但是不代表官方不支持keil开发,瑞萨官方提供了FSP工具开加速项目的开发,使用这款工具可以快速的建立iar、keil、cmake等mcu项目。诸如时钟配置,软件驱动,RTOS集成等等都可以搞定。下载FSP链接
这个软件的下载后,setup_fsp_v4_5_0_rasc_v2023-04.exe直接安装就可以了。过程非常的简单。
这之前一直使用e2Studio,这个软件运行较慢,编辑功能不是很习惯,安装完后
建立项目:
填写项目名称和目录。选择芯片或开发板,注意:这里有一个大坑!不能选择直接选择芯片,这样的项目程序会卡死在SystemInit()函数里。
这个不知道是不是软件bug,而且我对照了项目的配置,好像都是一样地。有知道的还请告知。
/*******************************************************************************************************************//**
* MCU starts executing here out of reset. Main stack pointer is set up already.
**********************************************************************************************************************/
void Reset_Handler (void)
{
/* Initialize system using BSP. */
SystemInit();
/* Call user application. */
main();
while (1)
{
/* Infinite Loop. */
}
}
所以测试选择了开发板。而没有选择芯片。
IDE选择Keil,我的MDK已升级到了ARM compiler 6版本,而且这个版本可以很好的兼容clang编译器。较好使用GNU的arm库。
这个选择flat模式。
项目配置:
使用new stack先加入r_sci_uart驱动,进行配置。
项目配置为通道9,因为只有通道9可以使用arduino接口的uart引脚,接着设置sci
设置sci为异步串口。设置中断函数名user_uart_callback()
修改这几处配置。填写中断函数名,user_adc_callback()
生成项目配置。打开keil
volatile bool uart_send_complete_flag = false;
volatile bool scan_complete_flag=false;
volatile IRQn_Type irq;
/**************************************************************/
/**************************************************************/
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{
/* TODO: add your own code here */
switch(p_args->event)
{
case UART_EVENT_TX_COMPLETE:
uart_send_complete_flag =true;
break;
default:
break;
}
}
/* Callback function */
void user_adc_callback(adc_callback_args_t *p_args)
{
/* TODO: add your own code here */
if(ADC_EVENT_SCAN_COMPLETE == p_args->event)
{
scan_complete_flag = true;
irq = R_FSP_CurrentIrqGet();
R_BSP_IrqDisable(irq);
}
//scan_complete_flag = true;
}
先加入,两个中断回调函数。主要的功能在hal_entry()函数中
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
/* TODO: add your own code here */
fsp_err_t err = FSP_SUCCESS;
unsigned char send_buff[32]="RA E2STUDIO ADC\n\r";
uint16_t adc_data0=0;
double a0 = 0.0;
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
size_t buff_len = strlen((char *)send_buff);
err = R_SCI_UART_Write(&g_uart9_ctrl, send_buff, buff_len);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
memset(send_buff,0,32);
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
for(;;){
err = R_ADC_ScanStart(&g_adc0_ctrl);
assert(FSP_SUCCESS == err);
while(scan_complete_flag == false){}
scan_complete_flag = false;
R_BSP_IrqEnable(irq);
err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0);
assert(FSP_SUCCESS == err);
a0=(double)(adc_data0/4095.0)*3.3;
sprintf((char *)send_buff, "a0=%f\r\n",a0);
buff_len = strlen((char *)send_buff);
err = R_SCI_UART_Write(&g_uart9_ctrl, send_buff, buff_len);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
memset(send_buff,0,32);
err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_HIGH);
err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay (200, BSP_DELAY_UNITS_MILLISECONDS);
err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_LOW);
err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay (200, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
程序是先是打开uar和adc设备,后面是调用驱动功能程序。
这里又有一个坑:为啥不用printf函数呢,因为搞不定!我先后实验了GNU的printf和keil的库,结果发现都不能工作,主要症状是,程序都会长时间的卡在检测字符发送while里,可能是因为不了解RA4E1芯片底层吧。
显示主要是使用uart串口输出。ADC信号使用简易信号源,检测如下:
直接连接ADC pin —— GND
输出比较平稳,偶尔出现0.001xxxV的输出,而且这是单次的测量,说明ADC的滤波做的很不错,个人感觉和TI的差距不大,当然TI的会好那么一丢丢,价格那也是杠杠地,这点真是对TI的MCU没辙。
这是测试1.5V信号的输出,感觉也是很稳定的,而且精度也很高。
后记:
这一阶段测试RA4E1很是辛苦,主要是瑞萨的产品国内用的人较少,案例也不是很多。而且还碰到了printf和芯片配置的坑,耽误了不少时间。不过整体还算顺利。
|