本帖最后由 hbzjt2011 于 2019-12-15 18:40 编辑
【东软载波ESF0654 PDS开发板活动】模板工程建立及LED、UART测试
ES-PDS 系列原型开发系统是上海东软载波微电子公司基于不同 MCU 产品设计的学习板,板载基于 ARM Crotex-M0 架构推出了全新的 32 位单片机芯片——ES32F0654LT,该系列单片机拥有丰富的外设、多样的通讯接口、极低的功耗特性,适用于智能电表、高端家电、仪器仪表、工业控制等领域,能够与 ST 的 F0 系列完美兼容。 ES-PDS 核心板正面集成了 ES-PDS 标准接口,反面集成了 ARDUINO 接口,可供安装相应功能的子板,并且两种接口所有脚都标注了芯片对应管脚的丝印。 下图为板子的靓照以及ES32单片机的仿真调试工具ES-LINK II。
公司提供了单片机的开发工具包ES32 SDK ,该开发工具包是东软载波微电子开发的、面向 ES32 系列微控制器内核以及外设的一套高集成、易使用、面向过程与对象相结合的驱动库,包括 MD、ALD、BSP、中间层驱动。SDK兼容 CMSIS 标准,可以高效地移植不同的操作系统、文件系统等第三方软件。
三种驱动库的区别如下:
- MD 驱动面向过程开发,接近微控制器底层操作,提供用户微控制器寄存器操作简单接口,操作方便;
- ALD 驱动对微控制器外设做抽象化操作,是一套抽象化的面向对象的驱动,用户无需更多关注底层设备的原理, 只需要调用相关外设的接口函数即可对外设进行操作;
- BSP 驱动提供了基于 ES32 微控制器开发板 ES-PDS 的驱动。
由于ALD驱动库进行了单片机底层寄存器的封装,因此更加适合于用户快速开发使用该单片机,因此我选择了该驱动库进行开发。ES32 SDK提供了标准的例程,包括IAR开发工具、Keil开发工具以及东软载波公司自己研发的iDesigner开发工具的例程。
【一】模板工程建立:
个人习惯了使用Keil进行开发,同时由于提供的模板工程感觉有些冗余,因此便自己重新建立了基于Keil的模板工程文件。具体过程如下:
首先从公司官网下载Keil 5芯片支持包,网址如下:http://www.essemi.com/article/c143.html,安装完成后建立Template样板工程文件夹,并依次建立以下文件夹:
其中Doc为说明文档文件夹,Drivers文件自己添加的外设驱动文件夹,Libraries文件ALD驱动库及CMSIS库文件夹,Project为工程文件夹,User为主程序文件夹。
接下来打开Keil 5软件,建立项目工程,选择ES32F0654LT芯片,该芯片也是板载的芯片型号:
然后建立如下文件结构,这里可以根据个人习惯进行调整:
项目工程设置选项主要部分是宏定义和头文件路径的添加以及选择调试工具和添加目标芯片型号,这里对于习惯使用Keil工具的朋友应该很熟悉:
最终建立完成的工程如下,现在提供给有需要的朋友下载使用。
模板工程:
Template.rar
(18.87 MB)
【二】板载LED灯及串口UART的测试:
开发板板载两颗LED灯,分为使用PC08及PC09驱动,UART通过JP4和JP5与ES-LINK相连,这样就可以使用ES-LINK的USB串口进行接收和调试。
其中LED部分的代码主要如下:
void led_pin_init(void)
{
//LED灯控制端口初始化
gpio_init_t x;
/* Initialize LED1 */
x.mode = GPIO_MODE_OUTPUT;
x.odos = GPIO_PUSH_PULL;
x.pupd = GPIO_PUSH_UP;
x.odrv = GPIO_OUT_DRIVE_NORMAL;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_CMOS;
x.func = GPIO_FUNC_1;
ald_gpio_init(LED1_PORT, LED1_PIN, &x);
/* Initialize LED2 */
x.mode = GPIO_MODE_OUTPUT;
x.odos = GPIO_PUSH_PULL;
x.pupd = GPIO_PUSH_UP;
x.odrv = GPIO_OUT_DRIVE_NORMAL;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_CMOS;
x.func = GPIO_FUNC_1;
ald_gpio_init(LED2_PORT, LED2_PIN, &x);
}
串口初始化过程代码如下:
void uart_pin_init(void)
{
gpio_init_t x;
/* Initialize tx pin */
x.mode = GPIO_MODE_OUTPUT;
x.odos = GPIO_PUSH_PULL;
x.pupd = GPIO_PUSH_UP;
x.odrv = GPIO_OUT_DRIVE_NORMAL;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_TTL;
x.func = GPIO_FUNC_5;
ald_gpio_init(UART2_TX_PORT, UART2_TX_PIN, &x);
/* Initialize rx pin */
x.mode = GPIO_MODE_INPUT;
x.odos = GPIO_PUSH_PULL;
x.pupd = GPIO_PUSH_UP;
x.odrv = GPIO_OUT_DRIVE_NORMAL;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_TTL;
x.func = GPIO_FUNC_5;
ald_gpio_init(UART2_RX_PORT, UART2_RX_PIN, &x);
return;
}
void uart_usb_init(void)
{
/* clear uart_handle_t structure */
memset(&h_uart, 0x0, sizeof(h_uart));
/* Initialize pin */
uart_pin_init();
/* Initialize uart */
h_uart.perh = UART2;
h_uart.init.baud = 115200;
h_uart.init.word_length = UART_WORD_LENGTH_8B;
h_uart.init.stop_bits = UART_STOP_BITS_1;
h_uart.init.parity = UART_PARITY_NONE;
h_uart.init.mode = UART_MODE_UART;
h_uart.init.fctl = UART_HW_FLOW_CTL_DISABLE;
ald_uart_init(&h_uart);
}
主程序如下:
int main()
{
/* Initialize ALD */
ald_cmu_init();
/* Configure system clock */
ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_48M);
ald_cmu_clock_config(CMU_CLOCK_PLL1, 48000000);
/* Initialize tx_buf */
memset(tx_buf, 0x55, sizeof(tx_buf));
///* Initialize uart_usb */
uart_usb_init();
/* Initialize led */
led_pin_init();
while (1) {
/* Send a message */
sprintf((char *)tx_buf, "es32 uart test!\n");
ald_uart_send(&h_uart, tx_buf, sizeof("es32 uart test!\n"), 1000);
ald_gpio_write_pin(LED1_PORT, LED1_PIN, 0);
ald_gpio_write_pin(LED2_PORT, LED2_PIN, 0);
ald_delay_ms(500);
ald_gpio_write_pin(LED1_PORT, LED1_PIN, 1);
ald_gpio_write_pin(LED2_PORT, LED2_PIN, 1);
ald_delay_ms(500);
}
}
编译下载后即可看到LED闪烁和串口打印的内容:
|