前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >M-Arch(雅特力M4)【AT-START-F425测评】No.03 调试串口,定时器与系统主要频率

M-Arch(雅特力M4)【AT-START-F425测评】No.03 调试串口,定时器与系统主要频率

作者头像
滚神大人
发布2022-04-18 14:18:02
4390
发布2022-04-18 14:18:02
举报
文章被收录于专栏:趣Python趣Python

前言

前一节整了开发环境搭建,并把主程序运行起来了。

上一节我们表扬了雅特力的网站组织方式,这一节再表扬一下雅特力的官方demo是给的最详细的,赞一个。

接下来开始喷了,-_-。

官方给的用户手册PDF竟然没有左边栏目录,这找起来好麻烦,情何以堪。

官方的驱动文件中,at32f425_xx.c没有直接包含at32f425_xx.h,底层驱动就直接点,不要那么多事

at32f425_conf.h文件,直接把头文件罗列注释不好吗?非要弄一个宏定义,多此一举。

代码语言:javascript
复制
#define ACC_MODULE_ENABLED
...
#ifdef ACC_MODULE_ENABLED
#include "at32f425_acc.h"
#endif

好好的【时钟树】名字多好,非要叫【时钟结构图】

这一节,我们把驱动整个OS的时基弄出来,也就是定时器,并通过调试串口,打印系统主要的时钟频率。

雅特力的资源编号是从1开始的,跟STM32的表达方式一致;

不过雅特力的函数采用的命名方式是下划线式,但是定时器不写成timer而是tmr,明显的没有理解下划线式命名的真谛。

定时器

采用定时器2来驱动整个OS,时基是1ms。

定时器初始化:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
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有。

代码语言:javascript
复制
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里面也能找到:

代码语言:javascript
复制
#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

接口示例:

代码语言:javascript
复制
crm_clocks_freq_type clock;
crm_clocks_freq_get(&clock);

打印代码示例:

代码语言:javascript
复制
#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

结果演示

代码语言:javascript
复制
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]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 定时器
  • 调试串口
  • 频率打印
  • 结果演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档