在使用单片机时对GPIO操作是最基础的操作,即使这种操作如果不注意还是会掉到坑里去。例如:使用同一组GPIO端口中的两个引脚(PA00和PA01)做输出,PA00在主循环中改变输出状态,PA01通过中断方式改变输出状态。正常的情况应该是PA00只在主循环中改变输出状态,而PA01只会在中断发生时改变输出状态。但是,随着程序运行时间的加长或者在主循环中提高PA00输出的频率,会发现本应该在中断中完成状态改变的PA01,个别时候状态会不发生改变。而在中断服务程序中设置断点,进行debug发现中断可以正常进入,也能正常改变PA01的输出状态。要想分析造成这个情况的原因可以从官方提供的DDL库入手来分析。华大单片机M0+系列芯片在对GPIO端口输出电平操作时,DDL库提供了如下两种方法:
方法1:
<p><font face="微软雅黑" size="3">/*****************************************************************************
** \brief GPIO IO输出值写入
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [out] bVal 输出值
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
{
SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);</font></p><p><font face="微软雅黑" size="3"> return Ok;
}</font></p>
方法2:
<p><font face="微软雅黑" size="3">/*******************************************************************************
** \brief GPIO IO设置
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
更多信息咨询请联系angel.qi:13827489351(微信与手机号码同步)
en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);</font></p><p><font face="微软雅黑" size="3"> return Ok;
}</font></p><p><font face="微软雅黑" size="3">
</font></p><p><font face="微软雅黑" size="3">/******************************************************************************
** \brief GPIO IO清零
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
*********************************
|