返回列表 发新帖我要提问本帖赏金: 510.00元(功能说明)

[APM32F1] 极海国产芯|我与APM32的结缘历程以及APM32库使用

[复制链接]
3319|14
 楼主| lilijin1995 发表于 2022-10-7 23:07 | 显示全部楼层 |阅读模式
本帖最后由 lilijin1995 于 2022-10-7 23:27 编辑

#申请原创#
@21小跑堂





我与APM32的故事:



2020年,我与APM32结缘,是在疫情开始之初,那时,还没有极海半导体,前身还是艾派克的时候,在机缘巧合之下,我发现APM32F103C8T6可以替换STM32F103C8T6,我关注了艾派克的公众号,并在推文中找到了朱经理,朱经理给我发了一张评估板和5颗APM32F103C8T6的芯片;然后就开启了APM32F103C8T6替换STM32F103C8T6的历程;
我们公司是做电脑、游戏外设的,用STM32F103C8T6这款料用在了很多产品上,后来疫情影响,从6块到最高200块,我一直建议公司采购几十K量,由于在大部分产品上都验证了,是完全不需要修改软件硬件的,就比如我们的霍尔摇杆,前期我们在1~2K的试产后,测试发现完全没有问题,后面客户测试也没有任何问题,公司就采购了几十K备料;
后来,果然不出我所料,STM32离谱哦,涨得完全没有下限,完全用不起啊;还好我们备料了;
2021,这是相当心酸的一年,要不是有这几十K的备料,公司完全活不下来,在这一年里,我们认识了艾瑞的邓先生,是朱经理推荐到他那拿货的,然后后来我又在汇昕微的梁工,他们是也是代理商,我们在这一年又在他们那拿了几十K,单价是含税9元左右;

在此之前我们以前开发的老产品和之后开发的新产品都是基于STM32的 HAL库,因为STM32CubeMX确实好用;



重新上路,基于APM32F10x_SDK开发新应用


习惯了STM32 HAL库的我们,就像被人捧上了天,再也很少脚踏实地,HAL有个毛病,就是臃肿,因为需要兼容很多型号,所以考虑了很多进去,层层封装,导致效率低下,可移植性虽强,但有点像捧杀一个人的感觉,太好用了,以至于你不想努力,想偷懒,只关注应用开发;


我们在此基于APM32F10x_SDK,体验一把标准库函数开发的魅力;


以下是第一个应用:

3.1 实例Eg1_KeyTest
我们想要测试一下按键的按下功能,主要是测试使用APM32F10x_SDK的库函数开发测试GPIO 输入模式的使用;

3.1.1硬件设计   
如下图是我们评估板的原理图 ,原理图是基于STM32F103的,不过APM32F103软硬件上完全兼容STM32F103,所以这里我们直接使用原理图,可以看到SW1~SW9分别有以下对应:
  1. #define         SW1         GPIO_ReadInputBit(GPIOA,GPIO_PIN_0)
  2. #define         SW2         GPIO_ReadInputBit(GPIOB,GPIO_PIN_9)
  3. #define         SW3         GPIO_ReadInputBit(GPIOB,GPIO_PIN_8)
  4. #define         SW4         GPIO_ReadInputBit(GPIOB,GPIO_PIN_7)
  5. #define         SW5         GPIO_ReadInputBit(GPIOB,GPIO_PIN_6)
  6. #define         SW6         GPIO_ReadInputBit(GPIOA,GPIO_PIN_15)
  7. #define         SW7         GPIO_ReadInputBit(GPIOB,GPIO_PIN_3)
  8. #define         SW8         GPIO_ReadInputBit(GPIOB,GPIO_PIN_4)
  9. #define         SW9         GPIO_ReadInputBit(GPIOB,GPIO_PIN_5)



我们只要配置8个GPIO作为输入去检测按键信号;
3.1.2 软件设计

首先关于新建工程,我们直接使用官方的Examples下面的GPIO例子,将输出改成输入模式,初始化代码如下:

  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]      Board_KeyGPIOInit
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. */
  8. void Board_KeyGPIOInit(void)
  9. {
  10.     GPIO_Config_T gpioConfigStruct;


  11.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_AFIO);
  12.     //PB3复位后是JTDO功能,这里需要禁用JTAG以实现PB3作为上拉输入模式 ,并且AFIO时钟也要使能
  13.     GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);

  14.     gpioConfigStruct.mode = GPIO_MODE_IN_PU;
  15.     gpioConfigStruct.pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
  16.                            |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  17.     gpioConfigStruct.speed = GPIO_SPEED_50MHz;

  18.     GPIO_Config(GPIOB, &gpioConfigStruct);

  19.     gpioConfigStruct.pin = GPIO_PIN_15;
  20.     GPIO_Config(GPIOA, &gpioConfigStruct);

  21.     gpioConfigStruct.mode = GPIO_MODE_IN_PD;
  22.     gpioConfigStruct.pin = GPIO_PIN_0;
  23.     GPIO_Config(GPIOA, &gpioConfigStruct);
  24. }



需要留意的是PB3复位后是JTDO功能(这点参考规格书可以确认),这里需要禁用JTAG以实现PB3作为上拉输入模式;由于Up主一开始也没有留意,直接配置,然后发现PB7一直处于按下,低电平状态,后来才通过查看规格书中引脚图得知PB3复位后是JTDO功能;这个故事告诉我们一个道理:数据手册要经常看;
另外我们发现RCM_APB2_PERIPH_AFIO时钟也需要使能,GPIO_ConfigPinRemap这个函数我们也是只禁用了JTAG;
初始化完成之后我们需要写一个测试程序以测试按键是否按下;

  1. void Board_ButtonScan(void)
  2. {
  3.     if(SW1==BIT_SET)
  4.     {
  5.         printf("SW1 Down\r\n");
  6.     }
  7.     if(SW2==BIT_RESET)
  8.     {
  9.         printf("SW2 Down\r\n");
  10.     }
  11.     if(SW3==BIT_RESET)
  12.     {
  13.         printf("SW3 Down\r\n");
  14.     }
  15.     if(SW4==BIT_RESET)
  16.     {
  17.         printf("SW4 Down\r\n");
  18.     }
  19.     if(SW5==BIT_RESET)
  20.     {
  21.         printf("SW5 Down\r\n");
  22.     }
  23.     if(SW6==BIT_RESET)
  24.     {
  25.         printf("SW6 Down\r\n");
  26.     }
  27.     if(SW7==BIT_RESET)
  28.     {
  29.         printf("SW7 Down\r\n");
  30.     }
  31.     if(SW8==BIT_RESET)
  32.     {
  33.         printf("SW8 Down\r\n");
  34.     }
  35.     if(SW9==BIT_RESET)
  36.     {
  37.         printf("SW9 Down\r\n");
  38.     }
  39. }



最后在main函数中的while循环里调用并延迟一会;

  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. int main(void)
  10. {
  11.     Board_KeyGPIOInit();
  12.     Board_UartPrintInit();
  13.     while (1)
  14.     {
  15.         Board_ButtonScan();
  16.         Delay();

  17.     }
  18. }

  19. /*!
  20. * @brief       Main program
  21. *
  22. * @param       None
  23. *
  24. * @retval      None
  25. *
  26. */
  27. void Delay(void)
  28. {
  29.     volatile uint32_t delay = 0xfffff;

  30.     while(delay--);
  31. }


3.1.3 下载验证
我们通过我们自有的仿真器模块WCH-link(DAP模式)把程序下载进去即可,仿真器需要选择CMSIS-DAP Debugger;  
我们把我们评估板上的H1的GND和TX分别接到wch-link的GND和RX;打开串口调试助手可以看到如下现象:
请看视频:











  

打赏榜单

Gfan 打赏了 500.00 元 2022-12-05
理由:恭喜获得极海国产芯悬赏贴活动的“最佳国产芯文博主”称号,感谢您的支持,期待下次的干货分享哦!

21小跑堂 打赏了 10.00 元 2022-10-14
理由:恭喜通过原创审核

评论

ST的HAL库带来了全新的开发体验,使应用的开发更为简单,以此带来的效率低下也是相对的,对系统要求不严格的还是很不错的,开发者不能依赖HAL库,还是要去接触底层寄存器,每一家的标准库都不相同,掌握核心科技才能不惧换芯挑战。  发表于 2022-10-14 10:51
onlycook 发表于 2022-10-8 11:51 来自手机 | 显示全部楼层
极海的前身是艾派克啊,看来也不算是新兴企业了
 楼主| lilijin1995 发表于 2022-10-8 17:44 | 显示全部楼层
onlycook 发表于 2022-10-8 11:51
极海的前身是艾派克啊,看来也不算是新兴企业了

半导体产业一般背后都有大财团支持才行吧,不然钱不够烧
chenqianqian 发表于 2022-10-8 20:21 来自手机 | 显示全部楼层
图裂了,视频也看不了,极海在国产MCU市场占有率好像还是不错。
海滨消消 发表于 2022-10-10 15:11 来自手机 | 显示全部楼层
半导体产业烧钱也赚钱啊,哈哈
 楼主| lilijin1995 发表于 2022-10-11 09:43 | 显示全部楼层
海滨消消 发表于 2022-10-10 15:11
半导体产业烧钱也赚钱啊,哈哈

正解,不然也不会冒险投资
mickit 发表于 2023-2-4 15:05 | 显示全部楼层
国产芯片开始兴起了了。              
olivem55arlowe 发表于 2023-2-4 17:30 | 显示全部楼层
APM32库都有什么要求呢?              
deliahouse887 发表于 2023-2-6 13:48 | 显示全部楼层
APM32跟st的兼容性非常高,代码可以直接替换掉。
sesefadou 发表于 2023-2-8 16:09 | 显示全部楼层
半导体的投入确实需要很多。              
saservice 发表于 2023-2-8 20:18 | 显示全部楼层
现在很多的厂家都要求国产芯片了。
极海代理 发表于 2024-4-12 18:16 | 显示全部楼层
感谢博主对极海产品的认可,我这边是极海国内top前三的代理商,有样品和技术需求请致电:15821666760
OKAKAKO 发表于 2024-4-15 19:55 | 显示全部楼层
HAL层层封装确实效率低下
szt1993 发表于 2024-4-16 20:04 | 显示全部楼层
极海的MCU确实非常不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部