本帖最后由 wucheng2009 于 2021-1-24 15:53 编辑
首先,主角登场(开发板+es-link):
还有1本台历和1页活动说明没拍(台历太多了,1个供应商最少寄1本,老板让我自己处理,给了几本给周围同事,还有好几本在抽屉里吃灰了) 接着下载资料,链接奉上:https://huodong.21ic.com/eastsoft/index?mobile=2 这次活动资料准备蛮全面的,基本上不需要再去官网翻资料。但是,缺一个比较重要的,keil插件没放在链接里面,如果需要在keil上编译下载,这个文件是必不可少的,然而官方一点提示都没有,按道理不管哪家的MCU,基本上都会开发一款插件安装到Keil安装目录下的,这是活动的组织者竟然漏掉了不提供。 不但如此,官网的技术支持板块竟然没找到,而且这个插件还藏的比较深,在官网的论坛里面才能找到,翻了1个小时左右,估计这里就实力劝退了不少人。 插件链接奉上:http://www.essemi.com/thread/134.html。 国际惯例,先安装插件,然后简单看了下ES32_SDK_V1.09文件包里面的文档说明。Projects目录下放置有各微控制器芯片的例程,所以直奔ES32F036XX文件包,大概翻了一遍,最后选了Discovery里面的例程,为什么呢?因为它是基于ALD驱动的,使用习惯接近于STM32的基本库操作。不需要纠结MCU寄存器怎么配置,爽歪歪。 接下来打开00_led例程的时候,keil提醒没找到器件,如下图,要下载芯片支持包:
然而提醒界面的链接打不开,只能手动安装下载好的1.0.8pcak,双击打开之后,继续弹窗报警,MDK版本过低,不支持安装,楼主当时没有截图,网上找了个一样报警的: 为什么会出现这种情况呢,因为楼主现在主要在开发3C类电子,而且因为成本原因,用的是台湾HT的单片机和他们家的编译器,所以已经半年没打开keil了 。加上之前用到都是stm8/stm32f030/stm32f103这几款来回切换,所以之前也一直没有更新MDK版本。 然后悲剧来了,这个时候楼主走入了一个误区,想着官网应该提供1.0.0版本的支持包,所以在官网上花了浪费了1个小时,还没找到 。 换个办法,更新MDK版本,结果更新不了,因为KEIL使用期过期了!众所周知,keil之前国内出过一个**器,只能用到2020年年底,楼主就是用到那个版本。 万能的度娘,别说还真有最新版本的keil的证书**软件和C51+MDK的新版本。 国际惯例,上链接: https://blog.csdn.net/JasonCrawford/article/details/104066624?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control 老办法,先安装C51和MDK到默认的安装目录(安装时会自动寻找已经安装好的目录),然后用管理员模式开打keil5,使用keil证书**更新有效期(到2032年)。 然后安装下载的1.0.8pcak包,一切顺利。 打开SDK里面的00_led例程,具体路径为:ES32_SDK_V1.09\ES32_SDK_V1.09\Projects\ES32F36xx\Discovery\00_led\MDK-ARM 打开例程后,编译->pass;烧录,咦!选哪个?懵逼中!!!查了一圈,官方也没写ES_Link怎么设置,也没找到官方的说明文件,只能笨方法一个个试了,终于,成功连上,如下图;
烧录->pass;然而,没有反应! 源码端上: //============main.c-===================// int main() { /* Initialize ALD */ ald_cmu_init(); /* Configure system clock */ ald_cmu_pll1_config(CMU_PLL1_INPUT_HRC_6, CMU_PLL1_OUTPUT_72M); ald_cmu_clock_config(CMU_CLOCK_PLL1, 72000000); ald_cmu_perh_clock_config(CMU_PERH_ALL, ENABLE); /* led init */ bsp_led_init(); while(1) { bsp_led_toggle(3); bsp_led_toggle(2); ald_delay_ms(300); } } //======================BSP_LED.C===============//void bsp_led_init(void)
{
gpio_init_t x;
bsp_led_off(2);
bsp_led_off(3);
x.mode = GPIO_MODE_OUTPUT;
x.pupd = GPIO_PUSH_UP;
x.odos = GPIO_PUSH_PULL;
x.nodrv = GPIO_OUT_DRIVE_1;
x.podrv = GPIO_OUT_DRIVE_1;
x.flt = GPIO_FILTER_DISABLE;
x.type = GPIO_TYPE_CMOS;
x.func = GPIO_FUNC_1;
ald_gpio_init(GPIO_PORT_LED2, GPIO_PIN_LED2, &x);
ald_gpio_init(GPIO_PORT_LED3, GPIO_PIN_LED3, &x);
}
void bsp_led_on(uint8_t num)
{
if (num == 2) {
GPIO_PORT_LED2->BSRR = (GPIO_PIN_LED2 << 15);
}
else if (num == 3) {
GPIO_PORT_LED3->BSRR = (GPIO_PIN_LED3 << 15);
}
}
void bsp_led_off(uint8_t num)
{
if (num == 2) {
GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2;
}
else if (num == 3) {
GPIO_PORT_LED3->BSRR = GPIO_PIN_LED3;
}
}
void bsp_led_toggle(uint8_t num)
{
if (num == 2) {
GPIO_PORT_LED2->BIR = GPIO_PIN_LED2;
}
else if (num == 3) {
GPIO_PORT_LED3->BIR = GPIO_PIN_LED3;
}
}//=================BSP_LED.H=============//
#define BSP_LED_MAX 2
#define GPIO_PORT_LED3 GPIOC
#define GPIO_PIN_LED3 GPIO_PIN_13
#define GPIO_PORT_LED2 GPIOC
#define GPIO_PIN_LED2 GPIO_PIN_10
按照代码应该是LED2(PC10),LED3(PC13)每隔300ms翻转一次; 对了一下板子上的LED2,边上印着丝印PF1?LED3,边上的丝印是OTG-5V?神马情况,通用代码,不是这块板子的?
看下官方打包过来的V1.3版本的原理图,确定了,源码和原理图对不上!OK,咱改代码,但是,LED2驱动端口标注为LED4,LED1驱动端口标注为LED3!蜜汁命名方式,咱也不知道为什么要这样,咱也不敢多问,你们开心就好哈。PS:弱弱的问一句,有小伙伴知道这有啥不可告人的秘密吗? 原理图截图:
咱换成LED1和LED2好了,对应端口PF0/PF1,源码更改: //=====================分隔符===============// main.c int main() { /* Initialize ALD */ ald_cmu_init(); /* Configure system clock */ ald_cmu_pll1_config(CMU_PLL1_INPUT_HRC_6, CMU_PLL1_OUTPUT_72M); ald_cmu_clock_config(CMU_CLOCK_PLL1, 72000000); ald_cmu_perh_clock_config(CMU_PERH_ALL, ENABLE); /* led init */ bsp_led_init(); while(1) { bsp_led_toggle(1); bsp_led_toggle(2); ald_delay_ms(300); } } //=====================分隔符===============// bsp_led.c void bsp_led_init(void) { gpio_init_t x;
bsp_led_off(1); bsp_led_off(2); x.mode = GPIO_MODE_OUTPUT; x.pupd = GPIO_PUSH_UP; x.odos = GPIO_PUSH_PULL; x.nodrv = GPIO_OUT_DRIVE_1; x.podrv = GPIO_OUT_DRIVE_1; x.flt = GPIO_FILTER_DISABLE; x.type = GPIO_TYPE_CMOS; x.func = GPIO_FUNC_1; ald_gpio_init(GPIO_PORT_LED1, GPIO_PIN_LED1, &x); ald_gpio_init(GPIO_PORT_LED2, GPIO_PIN_LED2, &x); }
void bsp_led_on(uint8_t num)
{
if (num == 1) {
GPIO_PORT_LED1->BSRR = (GPIO_PIN_LED1 << 15);
}
else if (num == 2) {
GPIO_PORT_LED2->BSRR = (GPIO_PIN_LED2 << 15);
}
}
void bsp_led_off(uint8_t num)
{
if (num == 1) {
GPIO_PORT_LED1->BSRR = GPIO_PIN_LED1;
}
else if (num == 2) {
GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2;
}
}
void bsp_led_toggle(uint8_t num)
{
if (num == 1) {
GPIO_PORT_LED1->BIR = GPIO_PIN_LED1;
}
else if (num == 2) {
GPIO_PORT_LED2->BIR = GPIO_PIN_LED2;
}
}
//=====================分隔符===============//
bsp_led.h
#define BSP_LED_MAX 2
#define GPIO_PORT_LED1 GPIOF
#define GPIO_PIN_LED1 GPIO_PIN_0
#define GPIO_PORT_LED2 GPIOF
#define GPIO_PIN_LED2 GPIO_PIN_1
//=====================分隔符===============//
编译一次,成功,没问题,烧录,LED1/LED2同时闪烁起来了。 OK,没问题。大概花了半天时间把官方例程跑起来了。 总结一下,官方准备的资料还算全面,正式开发会节约不少开发时间。美中不足的,没有提供keil插件,插件还不在官网的技术支持目录下,而是在论坛里面单独提供,一般找资料都应该是先找官方资料的,另外Keil界面没有使用说明,所以使用起来会有点找不到方向感的感觉。 最后,原理图编辑的有点任性。
|