目录
0x00 AT32F425C8T7 引脚矩阵映射关系
详情可见AT32手册
AT32的矩阵映射其实也就是开启端口的复用功能,但是它的功能更丰富。
AT32的引脚初始化函数:
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;/*复用模式*/
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PUT_PUSH_PULL;/*输出模式*/
gpio_init_struct.gpio_pins = GPIO_PINS_1;/*引脚号*/
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;/*有无上下拉电阻*/
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;/*驱动能力*/
gpio_init(GPIOA, &gpio_init_struct);/*初始化引脚*/
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_1);/*选择复用功能*/
0x01 AT32_Work_Bench 图形化配置指南
0x02 AT32串口打印函数
使用图形化工具配好引脚就可以开始使用,很简单,不需要自己去配置,并且没有标准库和hal库之说,配出来就是直接能用的函数。
void AT32_LOG(usart_type* USARTx, uint8_t *Data)
{
while(*Data!='\0')
{
while(usart_flag_get(USARTx, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USARTx, *Data);
while(usart_flag_get(USARTx, USART_TDC_FLAG) == RESET);
Data++;
}
}
0x03 AT32 串口中断函数
串口在初始化以后,还需要添加中断函数和使能中断。
中断函数已经被存储在 at32f425_int.c中,需要在这个文件中添加自己的内容
还需要在串口初始化函数中添加以下内容开启中断:
usart_interrupt_enable(USART2, USART_IDLE_INT, TRUE);
usart_interrupt_enable(USART2, USART_RDBF_INT, TRUE);
void USART1_IRQHandler(void)
{
if (usart_flag_get(USART1, USART_IDLEF_FLAG))
{
usart_flag_clear(USART1,USART_IDLEF_FLAG);
}
if (usart_flag_get(USART1, USART_IDLEF_FLAG))
{
}
}
0x04 AT32 延时函数
#include "at32f425_board.h"
#define STEP_DELAY_MS 50
static __IO uint32_t fac;
static __IO uint32_t fac_ms;
void at32_board_init()
{
delay_init();
}
void delay_init()
{
systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);
fac_us = system_core_clock / (1000000U);
fac_ms = fac_us * (1000U);
}
void delay_us(uint32_t nus)
{
uint32_t temp = 0;
SysTick->LOAD = (uint32_t)(nus * fac_us);
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
void delay_ms(uint16_t nms)
{
uint32_t temp = 0;
while(nms)
{
if(nms > STEP_DELAY_MS)
{
SysTick->LOAD = (uint32_t)(STEP_DELAY_MS * fac_ms);
nms -= STEP_DELAY_MS;
}
else
{
SysTick->LOAD = (uint32_t)(nms * fac_ms);
nms = 0;
}
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do
{
temp = SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1 << 16));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
}
void delay_sec(uint16_t sec)
{
uint16_t index;
for(index = 0; index < sec; index++)
{
delay_ms(500);
delay_ms(500);
}
}