发新帖本帖赏金 510.00元(功能说明)我要提问
返回列表
打印
[APM32F1]

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

[复制链接]
1174|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分别有以下对应:
#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;打开串口调试助手可以看到如下现象:
请看视频:











  

使用特权

评论回复

打赏榜单

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

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

评论
21小跑堂 2022-10-14 10:51 回复TA
ST的HAL库带来了全新的开发体验,使应用的开发更为简单,以此带来的效率低下也是相对的,对系统要求不严格的还是很不错的,开发者不能依赖HAL库,还是要去接触底层寄存器,每一家的标准库都不相同,掌握核心科技才能不惧换芯挑战。 
沙发
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市场占有率好像还是不错。

使用特权

评论回复
5
海滨消消| | 2022-10-10 15:11 | 只看该作者
半导体产业烧钱也赚钱啊,哈哈

使用特权

评论回复
6
lilijin1995|  楼主 | 2022-10-11 09:43 | 只看该作者
海滨消消 发表于 2022-10-10 15:11
半导体产业烧钱也赚钱啊,哈哈

正解,不然也不会冒险投资

使用特权

评论回复
7
mickit| | 2023-2-4 15:05 | 只看该作者
国产芯片开始兴起了了。              

使用特权

评论回复
8
olivem55arlowe| | 2023-2-4 17:30 | 只看该作者
APM32库都有什么要求呢?              

使用特权

评论回复
9
deliahouse887| | 2023-2-6 13:48 | 只看该作者
APM32跟st的兼容性非常高,代码可以直接替换掉。

使用特权

评论回复
10
sesefadou| | 2023-2-8 16:09 | 只看该作者
半导体的投入确实需要很多。              

使用特权

评论回复
11
saservice| | 2023-2-8 20:18 | 只看该作者
现在很多的厂家都要求国产芯片了。

使用特权

评论回复
12
极海代理| | 2024-4-12 18:16 | 只看该作者
感谢博主对极海产品的认可,我这边是极海国内top前三的代理商,有样品和技术需求请致电:15821666760

使用特权

评论回复
13
OKAKAKO| | 2024-4-15 19:55 | 只看该作者
HAL层层封装确实效率低下

使用特权

评论回复
14
szt1993| | 2024-4-16 20:04 | 只看该作者
极海的MCU确实非常不错

使用特权

评论回复
发新帖 本帖赏金 510.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

162

帖子

4

粉丝