378|2

240

帖子

0

TA的资源

纯净的硅(初级)

[航芯高性能MCU系列:ACM32F403开发板]1.熟悉开发环境、搭建基础工程 [复制链接]

1.ACM32F403

    ACM32F403芯片内核支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核支持一整套DSP指令用于数字信号处理,支持单精度FPU处理浮点数据,同时还支持Memory Protection Unit(MPU)用于提升应用的安全性。ACM32F403系列芯片最高工作频率可达 180MHz,内嵌数学硬件加速,内置最大 512KB 的 eFlash、最大 192KB SRAM、2MB SPI-NorFlash(选配)、8MB SPI-PSRAM(选配)。芯片集成了一个 12 位多通道 2M sps高精度 ADC、一个 12 位 2 通道的 DAC、多达 3 路运放、2 路比较器,集成了 1 个高级定时器,6 个通用 16位定时器,1 个通用 32 位定时器,2 个基本 16 位定时器,1 个系统看门狗,1 个独立看门狗,一个低功耗的实时钟(RTC),内置多路 UART、LPUART、SPI、I2C、I2S、CAN、全速 USB 等丰富的通讯外设,内建 AES、CRC、TRNG 等算法模块。

    高主频、丰富的外设、内置的大容易存储空间,给电机控制之外的应用提供了足够的资源,ADC、运放、比较器、高级定时器,这些都是必配的资源;借用这次测评机会来熟悉航芯高性能MCU系列:ACM32F403开发板,使用这个开发板来控制手上的滑台,进行控制技术验证。

0.jpg
1.jpg

 

2.资料获取

    芯片的开发资料可以到上海航芯电子科技股份有限公司官网上去获取(https://www.aisinochip.com/)

1.png

 

3.安装Pack包

3.png
4.png
5.png

 

4.原理图

31.png
32.png

 

5.创建KEIL工程

6.png
7.png
8.png
9.png
10.png
11.png
12.png
2.png

 

6.配置KEIL工程

13.png
14.png
15.png
16.png
17.png
18.png
19.png
20.png
21.png

 

7.编写代码

7.1.platform.c

#include "platform.h"

volatile uint32_t PLATFORM_DelayTick = 0;

void PLATFORM_InitSysTick(void)
{
    System_SysTick_Init();

    NVIC_SetPriority(SysTick_IRQn, 0);
}

void PLATFORM_ConfigDelay(void)
{
    TIM_Base_InitTypeDef TIM_Base_InitStruct;
    uint32_t             TIM_Clock;

    System_Module_Enable(EN_TIM6);

    if (System_Get_SystemClock() == System_Get_APBClock())
    {
        TIM_Clock = System_Get_APBClock();
    }
    else
    {
        TIM_Clock = System_Get_APBClock() * 2;
    }

    TIM_Base_InitStruct.Prescaler         = (TIM_Clock / 1000000) - 1;
    TIM_Base_InitStruct.Period            = 1000 - 1;
    TIM_Base_InitStruct.RepetitionCounter = 0;
    TIM_Base_InitStruct.CounterMode       = TIM_COUNTERMODE_UP;
    TIM_Base_InitStruct.ClockDivision     = TIM_CLOCKDIVISION_DIV1;
    TIM_TimeBase_Init(TIM6, &TIM_Base_InitStruct);

    NVIC_ClearPendingIRQ(TIM6_IRQn);
    NVIC_EnableIRQ(TIM6_IRQn);

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM6, ENABLE);
}

void PLATFORM_DelayMs(uint32_t Tick)
{
    PLATFORM_DelayTick = Tick;

    while (PLATFORM_DelayTick)
    {
    }
}

void PLATFORM_InitConsole(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    UART_InitTypeDef UART_InitStruct;

    System_Module_Enable(EN_GPIOAB);
    System_Module_Enable(EN_UART2);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.Pin       = GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = GPIO_FUNCTION_2;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    UART_StructInit(&UART_InitStruct);
    UART_InitStruct.UART_BaudRate            = 115200;
    UART_InitStruct.UART_WordLength          = UART_WORDLENGTH_8B;
    UART_InitStruct.UART_StopBits            = UART_STOPBITS_1;
    UART_InitStruct.UART_Parity              = UART_PARITY_NONE;
    UART_InitStruct.UART_Mode                = UART_MODE_TX_RX_DEBUG;
    UART_InitStruct.UART_HardwareFlowControl = UART_HWCONTROL_NONE;
    UART_Init(UART2, &UART_InitStruct);

    NVIC_ClearPendingIRQ(UART2_IRQn);
    NVIC_SetPriority(UART2_IRQn, 0);
    NVIC_EnableIRQ(UART2_IRQn);

    UART_ITConfig(UART2, UART_IT_RXNE, ENABLE);

    UART_Cmd(UART2, ENABLE);
}

//int fputc(int ch, FILE *f)
//{
//    UART_SendData(UART1, (uint8_t)ch);

//    UART_Wait_TX_Done(UART1);

//    return (ch);
//}

void PLATFORM_PrintClocks(void)
{
    printf("\r\nACM32F403RET7 %s %s", __DATE__, __TIME__);

    printf("\r\n");
    printf("\r\nSystemClock Frequency : %7.3f MHz", (double)System_Get_SystemClock() / (double)1000000.0);
    printf("\r\nAPBClock    Frequency : %7.3f MHz", (double)System_Get_APBClock() / (double)1000000.0);
    printf("\r\n");
}

void PLATFORM_Init(void)
{
    PLATFORM_InitSysTick();

    PLATFORM_ConfigDelay();

    PLATFORM_InitConsole();

    PLATFORM_PrintClocks();
}

 

7.2.acm32f403ret7_it.c

#include "acm32f403ret7_it.h"
#include "key.h"
#include "platform.h"
#include "multi_button.h"

void NMI_Handler(void)
{
    while (1)
    {
    }
}

//void HardFault_Handler(void)
//{
//    while (1)
//    {
//    }
//}

void MemManage_Handler(void)
{
    while (1)
    {
    }
}

void BusFault_Handler(void)
{
    while (1)
    {
    }
}

void UsageFault_Handler(void)
{
    while (1)
    {
    }
}

void SVC_Handler(void)
{
    while (1)
    {
    }
}

void DebugMon_Handler(void)
{
    while (1)
    {
    }
}

void PendSV_Handler(void)
{
    while (1)
    {
    }
}

void SysTick_Handler(void)
{
    if (KeyRegisterFlag)
    {
        button_ticks();
    }
}

void TIM6_IRQHandler(void)
{
    if (RESET != TIM_GetFlagStatus(TIM6, TIMER_SR_UIF))
    {
        if (PLATFORM_DelayTick)
        {
            PLATFORM_DelayTick--;
        }

        TIM_ClearFlag(TIM6, TIMER_SR_UIF);
    }
}

void UART2_IRQHandler(void)
{
    if (UART_GetITStatus(UART2, UART_IT_RXNE) != RESET)
    {
        UART_ClearITPendingBit(UART2, UART_IT_RXNE);

        printf("%c", UART_ReceiveData(UART2));
    }
}

 

7.3.bsp_key.c

#include "bsp_key.h"

void bsp_KeyInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    System_Module_Enable(EN_GPIOCD);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.Pin       = GPIO_PIN_13;
    GPIO_InitStruct.Mode      = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull      = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

uint8_t bsp_KeyReadPinLevel(uint8_t Index)
{
    uint8_t PinLevel = 0;

    PinLevel = GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_13);

    return (PinLevel);
}

 

7.4.bsp_led.c

#include "bsp_led.h"

void bsp_LedInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    System_Module_Enable(EN_GPIOEF);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.Pin       = GPIO_PIN_3;
    GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
    GPIO_Init(GPIOF, &GPIO_InitStruct);

    GPIO_WriteBit(GPIOF, GPIO_PIN_3, Bit_SET);
}

void bsp_LedOn(void)
{
    GPIO_WriteBit(GPIOF, GPIO_PIN_3, Bit_RESET);
}

void bsp_LedOff(void)
{
    GPIO_WriteBit(GPIOF, GPIO_PIN_3, Bit_SET);
}

void bsp_LedToggle(void)
{
    if (GPIO_ReadOutputDataBit(GPIOF, GPIO_PIN_3) == RESET)
    {
        GPIO_WriteBit(GPIOF, GPIO_PIN_3, Bit_SET);
    }
    else
    {
        GPIO_WriteBit(GPIOF, GPIO_PIN_3, Bit_RESET);
    }
}

 

7.5.key.c

#include "key.h"
#include "bsp_key.h"
#include "multi_button.h"

struct Button keyUser;

volatile uint8_t KeyRegisterFlag = 0;

void KEY_UserHandler(void *btn)
{
    struct Button *handle = (struct Button *)btn;

    if (handle->button_id == 0)
    {
        printf("\r\n%s", __FUNCTION__);
    }
}

void KEY_Init(void)
{
    button_init(&keyUser, bsp_KeyReadPinLevel, RESET, 0);
    button_attach(&keyUser, PRESS_DOWN, KEY_UserHandler);
    button_start(&keyUser);

    KeyRegisterFlag = 1;
}

 

7.6.main.c

#include "main.h"
#include "key.h"
#include "platform.h"
#include "bsp_key.h"
#include "bsp_led.h"

int main(void)
{
    System_Init();

    PLATFORM_Init();

    bsp_KeyInit();
    bsp_LedInit();

    KEY_Init();

    while (1)
    {
        bsp_LedToggle();
        PLATFORM_DelayMs(200);
    }
}

 

8.编译调试

8.1.第一次编译,提示cannot link……提示,通过与官方例程对比,缺少了个文件,将其添加进工程,就解决了

22.png
23.png
 
8.2.再次编译,提示有2个函数重复定义了,将自己实现的部分注释掉,问题解决了
24.png
25.png
26.png
 
8.3.通过查看底层的驱动代码,fputs函数调用的是Uart_Debug这个串口,这个是在串口初始化时对其进行赋值的
27.png
28.png
29.png

 

9.运行效果

9.1.串口打印

30.png

 

9.2.LED闪烁效果

33

 

10.附件

Project.zip (1.3 MB, 下载次数: 0)

最新回复

大佬的帖子分享非常细致,从开发板的介绍到基础工程的创建,图文并茂,同时分享了基础工程。辛苦了,期待精彩作品继续!   详情 回复 发表于 2025-3-5 15:57

赞赏

1

查看全部赞赏

个人签名We are a team and we work as a team !

回复
举报

7185

帖子

11

TA的资源

版主

大佬的帖子分享非常细致,从开发板的介绍到基础工程的创建,图文并茂,同时分享了基础工程。辛苦了,期待精彩作品继续!


回复

240

帖子

0

TA的资源

纯净的硅(初级)

lugl4313820 发表于 2025-3-5 15:57 大佬的帖子分享非常细致,从开发板的介绍到基础工程的创建,图文并茂,同时分享了基础工程。辛苦了,期待精 ...

个人签名We are a team and we work as a team !

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表