本帖最后由 hbzjt2011 于 2021-1-5 22:36 编辑
#申请原创# ES-PDS 系列原型开发系统是上海东软载波微电子公司基于不同 MCU 产品设计的学习板,主要用于指导工程师快速学习 MCU 的各种外设功能,ES-PDS 硬件由核心板包括,LED,按键,导航键,LCD,电源切换开关,USB,电位器, LCD,USB(OTG),电机驱动,CAN 总线等等常用外设,正面集成了 ES-PDS 标准接口,反面集成了 ARDUINO 接口。核心板及ES-LINK II下载调试工具如下图所示:
板载的ES32F3696 MCU 最大支持 512KB FLASH 和 96KB SRAM, 且支持通过 EBI 接口扩展外部存储。支持 QSPI 接口,不仅可用于外部 FLASH 等存储扩展,也可支持高速数据传输。支持多达 84个 IO,支持 2 路 12 位 ADC,2 路 12 位 DAC,3 路模拟比较器,支持 RTC 日历、闹钟等功能。带丰富的定时器资源,支持 2 路高级定时器(AD16C4T),2 路通用定时器(GP16C4T),2 路基本定时器(BS16T), 2 路 32 位通用定时器。 支持丰富的通信资源, 包括 2 路 I2C, 3 路 SPI/I2S, 6 路 UART,另外支持全速/高速 USB 主机、设备和 OTG 接口,还支持 CAN 接口通信。
东软载波公司提供了单片机的开发工具包ES32 SDK ,该开发工具包是东软载波微电子开发的、面向 ES32 系列微控制器内核以及外设的一套高集成、易使用、面向过程与对象相结合的驱动库,包括 MD、ALD、BSP、中间层驱动。SDK兼容 CMSIS 标准,可以高效地移植不同的操作系统、文件系统等第三方软件。
三种驱动库的区别如下:
- MD 驱动面向过程开发,接近微控制器底层操作,提供用户微控制器寄存器操作简单接口,操作方便;
- ALD 驱动对微控制器外设做抽象化操作,是一套抽象化的面向对象的驱动,用户无需更多关注底层设备的原理, 只需要调用相关外设的接口函数即可对外设进行操作;
- BSP 驱动提供了基于 ES32 微控制器开发板 ES-PDS 的驱动。
由于ALD驱动库进行了单片机底层寄存器的封装,因此更加适合于用户快速开发使用该单片机,因此我选择了该驱动库进行开发。ES32 SDK提供了标准的例程,包括IAR开发工具、Keil开发工具以及东软载波公司自己研发的iDesigner开发工具的例程。由于 Keil4 不支持 PACK 机制,因此这里选择Keil5进行开发。
具体的模板工程建立步骤可参考我之前发布的贴子,这里只需要将最新版的ALD库文件和CMSIS文件替换,然后添加ES32F36xx的启动文件和包含目录即可:
【东软载波ESF0654 PDS开发板活动】模板工程建立及LED、UART测试
https://bbs.21ic.com/icview-2888774-1-1.html?fromuser=hbzjt2011
(出处: 中国电子网技术论坛)
这里同样使用板载的LED灯和UART进行测试,两个LED灯使用PF0和PF1控制,UART的发送和接收引脚分别为PB10和PB11,采用UART0,代码如下:led.c
#include "main.h"
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.podrv = GPIO_OUT_DRIVE_6;
x.nodrv = GPIO_OUT_DRIVE_6;
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.podrv = GPIO_OUT_DRIVE_6;
x.nodrv = GPIO_OUT_DRIVE_6;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_CMOS;
x.func = GPIO_FUNC_1;
ald_gpio_init(LED2_PORT, LED2_PIN, &x);
}
uart_usb.c
#include "main.h"
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] Initializate pin of uart module.
* @retval None
*/
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.podrv = GPIO_OUT_DRIVE_1;
x.nodrv = GPIO_OUT_DRIVE_0_1;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_TTL;
x.func = GPIO_FUNC_3;
ald_gpio_init(UART0_TX_PORT, UART0_TX_PIN, &x);
/* Initialize rx pin */
x.mode = GPIO_MODE_INPUT;
x.odos = GPIO_PUSH_PULL;
x.pupd = GPIO_PUSH_UP;
x.podrv = GPIO_OUT_DRIVE_1;
x.nodrv = GPIO_OUT_DRIVE_0_1;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_TTL;
x.func = GPIO_FUNC_3;
ald_gpio_init(UART0_RX_PORT, UART0_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 = UART0;
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);
}
main.c
#include "main.h"
/** @addtogroup Projects_Templates_ALD
* @{
*/
/** @addtogroup Templates
* @{
*/
uart_handle_t h_uart;
uint8_t tx_buf[32];
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] This is main function.
* Detect running time.
* @retval Status
*/
int main()
{
/* Initialize ALD */
ald_cmu_init();
/* Configure system clock */
ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_72M);
ald_cmu_clock_config(CMU_CLOCK_PLL1, 72000000);
/* Enable peripheral */
ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE);
ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE);
/* 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);
}
}
编译完成后,使用ES-LINK下载程序,重新上电后可以看到程序运行效果如下:
@21小跑堂
|