前一节整了开发环境搭建,并把主程序运行起来了。
上一节我们表扬了雅特力的网站组织方式,这一节再表扬一下雅特力的官方demo是给的最详细的,赞一个。
接下来开始喷了,-_-。
官方给的用户手册PDF竟然没有左边栏目录,这找起来好麻烦,情何以堪。
官方的驱动文件中,at32f425_xx.c没有直接包含at32f425_xx.h,底层驱动就直接点,不要那么多事
at32f425_conf.h文件,直接把头文件罗列注释不好吗?非要弄一个宏定义,多此一举。
#define ACC_MODULE_ENABLED
...
#ifdef ACC_MODULE_ENABLED
#include "at32f425_acc.h"
#endif
好好的【时钟树】名字多好,非要叫【时钟结构图】
这一节,我们把驱动整个OS的时基弄出来,也就是定时器,并通过调试串口,打印系统主要的时钟频率。
雅特力的资源编号是从1开始的,跟STM32的表达方式一致;
不过雅特力的函数采用的命名方式是下划线式,但是定时器不写成timer而是tmr,明显的没有理解下划线式命名的真谛。
采用定时器2来驱动整个OS,时基是1ms。
定时器初始化:
void timer2_init(void)
{
tmr_reset(TMR2);
crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
timerx_init(TMR2, 9599, 9); // 10KHz 1ms
tmr_interrupt_enable(TMR2, TMR_OVF_INT, TRUE);
nvic_irq_enable(TMR2_GLOBAL_IRQn, 6, 0);
}
static void timerx_init(tmr_type* TIMx, uint16_t prescaler, uint16_t period)
{
timerx_init_full(TIMx, prescaler, period, TMR_CLOCK_DIV1, TMR_COUNT_UP, 0);
}
static void timerx_init_full(tmr_type* TIMx, uint16_t prescaler, uint16_t period, uint16_t clock_div, uint16_t counter_mode, uint8_t repetition_counter)
{
tmr_base_init(TIMx, period, prescaler);
tmr_repetition_counter_set(TIMx, repetition_counter);
tmr_cnt_dir_set(TIMx, TMR_COUNT_UP);
tmr_clock_source_div_set(TIMx, clock_div);
tmr_counter_enable(TIMx, TRUE);
}
串口初始化类似的,用串口1,PA9发送,官方给的demo有。
void uart1_init(uint32_t baudrate)
{
usart_type* com = USART1;
gpio_init_type gpio_init_struct;
usart_reset(com);
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
///< USART1_TX PA.9
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = GPIO_PINS_9;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1);
usart_init(com, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(com, TRUE);
usart_enable(com, TRUE);
}
支持printf,这个demo里面也能找到:
#ifdef USING_PRINTF
#define PRINTF_UART USART1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
usart_data_transmit(PRINTF_UART, (uint8_t)ch);
while(RESET == usart_flag_get(PRINTF_UART, USART_TDBE_FLAG));
return ch;
}
雅特力的这个接口跟STM32的类似,crm_clocks_freq_get
。
接口示例:
crm_clocks_freq_type clock;
crm_clocks_freq_get(&clock);
打印代码示例:
#if defined(AT32)
crm_clocks_freq_type clock;
crm_clocks_freq_get(&clock);
freq[0] = clock.sclk_freq/1000000;
freq[1] = clock.ahb_freq/1000000;
freq[2] = clock.apb1_freq/1000000;
freq[3] = clock.apb2_freq/1000000;
freq[4] = clock.adc_freq/1000000;
#endif
printf("freq: SYS[%d MHz] AHB[%d MHz] APB1[%d MHz] APB2[%d MHz] ADC[%d MHz]\r\n",
freq[0], freq[1], freq[2], freq[3], freq[4]);
#endif
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]
freq: SYS[96 MHz] AHB[96 MHz] APB1[96 MHz] APB2[96 MHz] ADC[48 MHz]