本帖最后由 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分别有以下对应: - #define SW1 GPIO_ReadInputBit(GPIOA,GPIO_PIN_0)
- #define SW2 GPIO_ReadInputBit(GPIOB,GPIO_PIN_9)
- #define SW3 GPIO_ReadInputBit(GPIOB,GPIO_PIN_8)
- #define SW4 GPIO_ReadInputBit(GPIOB,GPIO_PIN_7)
- #define SW5 GPIO_ReadInputBit(GPIOB,GPIO_PIN_6)
- #define SW6 GPIO_ReadInputBit(GPIOA,GPIO_PIN_15)
- #define SW7 GPIO_ReadInputBit(GPIOB,GPIO_PIN_3)
- #define SW8 GPIO_ReadInputBit(GPIOB,GPIO_PIN_4)
- #define SW9 GPIO_ReadInputBit(GPIOB,GPIO_PIN_5)
我们只要配置8个GPIO作为输入去检测按键信号; 3.1.2 软件设计
首先关于新建工程,我们直接使用官方的Examples下面的GPIO例子,将输出改成输入模式,初始化代码如下:
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] Board_KeyGPIOInit
- *
- * @param None
- *
- * @retval None
- */
- void Board_KeyGPIOInit(void)
- {
- GPIO_Config_T gpioConfigStruct;
-
-
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_AFIO);
- //PB3复位后是JTDO功能,这里需要禁用JTAG以实现PB3作为上拉输入模式 ,并且AFIO时钟也要使能
- GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);
-
- gpioConfigStruct.mode = GPIO_MODE_IN_PU;
- gpioConfigStruct.pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
- |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
- gpioConfigStruct.speed = GPIO_SPEED_50MHz;
-
- GPIO_Config(GPIOB, &gpioConfigStruct);
-
- gpioConfigStruct.pin = GPIO_PIN_15;
- GPIO_Config(GPIOA, &gpioConfigStruct);
-
- gpioConfigStruct.mode = GPIO_MODE_IN_PD;
- gpioConfigStruct.pin = GPIO_PIN_0;
- GPIO_Config(GPIOA, &gpioConfigStruct);
- }
需要留意的是PB3复位后是JTDO功能(这点参考规格书可以确认),这里需要禁用JTAG以实现PB3作为上拉输入模式;由于Up主一开始也没有留意,直接配置,然后发现PB7一直处于按下,低电平状态,后来才通过查看规格书中引脚图得知PB3复位后是JTDO功能;这个故事告诉我们一个道理:数据手册要经常看; 另外我们发现RCM_APB2_PERIPH_AFIO时钟也需要使能,GPIO_ConfigPinRemap这个函数我们也是只禁用了JTAG; 初始化完成之后我们需要写一个测试程序以测试按键是否按下;
- void Board_ButtonScan(void)
- {
- if(SW1==BIT_SET)
- {
- printf("SW1 Down\r\n");
- }
- if(SW2==BIT_RESET)
- {
- printf("SW2 Down\r\n");
- }
- if(SW3==BIT_RESET)
- {
- printf("SW3 Down\r\n");
- }
- if(SW4==BIT_RESET)
- {
- printf("SW4 Down\r\n");
- }
- if(SW5==BIT_RESET)
- {
- printf("SW5 Down\r\n");
- }
- if(SW6==BIT_RESET)
- {
- printf("SW6 Down\r\n");
- }
- if(SW7==BIT_RESET)
- {
- printf("SW7 Down\r\n");
- }
- if(SW8==BIT_RESET)
- {
- printf("SW8 Down\r\n");
- }
- if(SW9==BIT_RESET)
- {
- printf("SW9 Down\r\n");
- }
- }
最后在main函数中的while循环里调用并延迟一会;
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] Main program
- *
- * @param None
- *
- * @retval None
- *
- */
- int main(void)
- {
- Board_KeyGPIOInit();
- Board_UartPrintInit();
- while (1)
- {
- Board_ButtonScan();
- Delay();
-
- }
- }
-
- /*!
- * @brief Main program
- *
- * @param None
- *
- * @retval None
- *
- */
- void Delay(void)
- {
- volatile uint32_t delay = 0xfffff;
-
- while(delay--);
- }
3.1.3 下载验证我们通过我们自有的仿真器模块WCH-link(DAP模式)把程序下载进去即可,仿真器需要选择CMSIS-DAP Debugger; 我们把我们评估板上的H1的GND和TX分别接到wch-link的GND和RX;打开串口调试助手可以看到如下现象: 请看视频:
|