EFM32PG1B使用时遇到那些的坑

坑一:引脚功能定义

 公司项目需要用到EFM32系列的单片机,初看芯片手册,看到引脚定义的时候着实有些疑惑
这里以串口一引脚为例
 初看的第一感觉是这些引脚都具有串口功能吗?这么自由的吗?没错,它就是这么自由。我以串口一的发送引脚为例进行说明,即US1_TX ,这里要说一下,EFM32的串口引脚和SPI引脚是复用的,使用函数库的时候,我们也可以看到SPI和串口发送调用的寄存器也是同一个,这一点其实比较方便。US1_TX 的右边跟了32个引脚,这些引脚全部可以用作串口一的发送引脚。
 代码层应该如何实现呢?我们可以看到每个引脚前都有一个序号 比如 0:PA0 当我们需要使用PA0作为发送引脚时:

	USART0->ROUTELOC0 = (USART0->ROUTELOC0 & (~_USART_ROUTELOC0_TXLOC_MASK))
			| USART_ROUTELOC0_TXLOC_LOC0;

 只需要将USART0->ROUTELOC0寄存器配置为USART_ROUTELOC0_TXLOC_LOC0(标号对应)如果要用4:PA4 那么就配置为USART_ROUTELOC0_TXLOC_LOC4就可以了
 这里不由的想吐槽一下,当然也可能是我自己没有找到(求生欲),我一直都找不到寄存器的说明手册,如果有明确的Programmer.pdf,那就轻松太多了,毕竟摸着石头过河太难了,单纯的datasheet有点儿太弱了。

坑二:外部中断的使用

 EFM32的外部中断有两个,一个是:GPIO_EVEN_IRQn 一个是:GPIO_ODD_IRQn。对于STM32来讲,外部中断按引脚数分为LINE0、LINE1等。我们的小壁虎有点儿顽皮,简单粗暴的把所有中断线分为了两类,奇数引脚线和偶数引脚线。EVEN_IRQn是偶数引脚中断、ODD_IRQn是奇数引脚中断。进入中断后,直接进行判断和清中断操作:

/**************************************************************************//**
 * @brief GPIO Interrupt handler
 *****************************************************************************/
void GPIO_EVEN_IRQHandler(void)
{
    
    
	uint32_t flags;
	flags = GPIO_IntGet();
	GPIO_IntClear(flags);
}
/**************************************************************************//**
 * @brief GPIO Interrupt handler
 *****************************************************************************/
void GPIO_ODD_IRQHandler(void)
{
    
    
	uint32_t flags;
	flags = GPIO_IntGet();
	GPIO_IntClear(flags);
}

 我个人其实不是很喜欢使用官方的库,好多时候直接配置寄存器就OK了,没必要调用复杂的库函数,多数的库函数要满足兼容性,因此库函数的复杂程度就增加了。所以我还是建议时间充裕的情况下多使用寄存器操作,减少代码的执行效率。

官网链接

可以找一找资料之类的
Pearl Gecko Device 官网连接

猜你喜欢

转载自blog.csdn.net/m0_38127906/article/details/107140810