本帖最后由 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;打开串口调试助手可以看到如下现象: 请看视频:
|
ST的HAL库带来了全新的开发体验,使应用的开发更为简单,以此带来的效率低下也是相对的,对系统要求不严格的还是很不错的,开发者不能依赖HAL库,还是要去接触底层寄存器,每一家的标准库都不相同,掌握核心科技才能不惧换芯挑战。