今天周六,来公司加班,顺便测试一下现在的这个AT32F437,今天主要是看串口和定时器,因为这两个外设做好了之后就可以移植CoreMARK了,所以这里先把这两个外设搞定,
根据官方的例程做修改,目前还是很容易把这个搞定的,但是在定时器的时候需要注意一点,定时器是倍频了2倍的,相当于APB2最多到144MHz,但是Timer最多到288M,和主频一样高了,这样的话可以提高定时器的精度,这里提醒一下大家,大家有空的话可以研究一下那个定时器的配置问题。具体的参考AT32f437F437的参考手册的CRM章节,里面有详细的介绍。
CRM时钟配置框图
根据AT32F437的原理图可以知道,我们的板子是自带了的串口的功能的,需要注意的是,JP4的跳线需要跳到串口上,不是USB的功能上,具体的请参考原理图,而且从原理图上也可以轻易的知道使用的是PA9和PA10的两个引脚。
串口功能选择
好了,下面就来上传一下代码吧。
下面是定时器的初始化以及配置函数。
#include "DRV_Time.h"
void Timer_Init(void)
{
crm_clocks_freq_type crm_clocks_freq_struct = {0};
/* get system clock */
crm_clocks_freq_get(&crm_clocks_freq_struct);
/* enable tmr1 clock */
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
/* tmr1 configuration */
/* time base configuration */
tmr_base_init(TMR1, 999, 287);//--288分频 =1M 1000计数,相当于1ms ----
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
/* overflow interrupt enable */
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
/* tmr1 hall interrupt nvic init */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 1, 0);
/* enable tmr1 */
tmr_counter_enable(TMR1, TRUE);
}
unsigned int DATACount=0;
void TMR1_OVF_TMR10_IRQHandler(void)
{
if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET)
{
/* add user code... */
DATACount++;
if(DATACount==500)
{
gpio_bits_set(GPIOD,GPIO_PINS_15);
}
if(DATACount==1000)
{
DATACount=0;
gpio_bits_reset(GPIOD,GPIO_PINS_15);
}
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
}
下面是串口的配置函数
#include "DRV_UART1.h"
void UART1_Init(void)
{
gpio_init_type gpio_init_struct;
/* enable the usart2 and gpio clock */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
/* configure the usart2 tx, rx pin */
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_PINS_10;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_7);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7);
/* config usart nvic interrupt */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(USART1_IRQn, 0, 0);
/* configure usart2 param */
usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(USART1, TRUE);
usart_receiver_enable(USART1, TRUE);
/* enable usart2 and usart3 interrupt */
usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
usart_enable(USART1, TRUE);
}
void USART1_IRQHandler(void)
{
if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
{
usart_flag_clear(USART1, USART_RDBF_FLAG);
usart_data_transmit(USART1,usart_data_receive(USART1));
}
//--
if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
{
usart_flag_clear(USART1, USART_TDBE_FLAG);
}
}
int fputc(int ch, FILE *f)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, ch);
return ch;
}
串口测试
好了,说完了,还是把代码分享出来给大家把,到时候大家一起研究
如果快的话,下次和大家分享Coremark的代码
|