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开发板,使用这个开发板来控制手上的滑台,进行控制技术验证。
2.资料获取
芯片的开发资料可以到上海航芯电子科技股份有限公司官网上去获取(https://www.aisinochip.com/)
3.安装Pack包
4.原理图
5.创建KEIL工程
6.配置KEIL工程
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……提示,通过与官方例程对比,缺少了个文件,将其添加进工程,就解决了
8.2.再次编译,提示有2个函数重复定义了,将自己实现的部分注释掉,问题解决了
8.3.通过查看底层的驱动代码,fputs函数调用的是Uart_Debug这个串口,这个是在串口初始化时对其进行赋值的
9.运行效果
9.1.串口打印
9.2.LED闪烁效果
33
10.附件