stm32库函数GPIO_PinRemapConfig分析
2013-09-12 16:01
183 查看
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
{
uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_REMAP(GPIO_Remap));//检测传递参数是否有效
assert_param(IS_FUNCTIONAL_STATE(NewState)); //同上
if((GPIO_Remap & 0x80000000) == 0x80000000)//判断GPIO_Remap范围
{
tmpreg = AFIO->MAPR2;//大容量的芯片扩展GPIO_Remap
}
else
{
tmpreg = AFIO->MAPR;//基本GPIO_Remap
}
tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;//以USART3为例(0x00140010&0x000F0000)>>0x10等于0x00000004,有寻找(有2个控制位的)USART3-REMAP在AFIO_MAPR的位置作用
tmp = GPIO_Remap & LSB_MASK;//有寻找(有1个控制位的)在AFIO_MAPR的位置作用
if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK))
//串行线JTAG配置
{
tmpreg &= DBGAFR_SWJCFG_MASK;//将要配置的内容赋值给变量tmpreg
AFIO->MAPR &= DBGAFR_SWJCFG_MASK;//将SWJ_CFG控制位清零
}
else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK)
//配置有两个控制位复用重映射
{
tmp1 = ((uint32_t)0x03) << tmpmask;//找到要配置的位
tmpreg &= ~tmp1;//将要配置的内容赋值给变量tmpreg
tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg
}
else
//配置有1个控制位复用重映射
{
tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10));//将要配置的内容赋值给变量tmpreg
tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg
}
if (NewState != DISABLE)
{
tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10));//使能或失能某个外设的重映射
}
if((GPIO_Remap & 0x80000000) == 0x80000000)
{
AFIO->MAPR2 = tmpreg;
}
else
{
AFIO->MAPR = tmpreg;//将配置内容写到AFIO_MAPR寄存器中
}
}
新手第一次写博客,内容简介,分析不够深入,请见谅!
{
uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_REMAP(GPIO_Remap));//检测传递参数是否有效
assert_param(IS_FUNCTIONAL_STATE(NewState)); //同上
if((GPIO_Remap & 0x80000000) == 0x80000000)//判断GPIO_Remap范围
{
tmpreg = AFIO->MAPR2;//大容量的芯片扩展GPIO_Remap
}
else
{
tmpreg = AFIO->MAPR;//基本GPIO_Remap
}
tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;//以USART3为例(0x00140010&0x000F0000)>>0x10等于0x00000004,有寻找(有2个控制位的)USART3-REMAP在AFIO_MAPR的位置作用
tmp = GPIO_Remap & LSB_MASK;//有寻找(有1个控制位的)在AFIO_MAPR的位置作用
if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK))
//串行线JTAG配置
{
tmpreg &= DBGAFR_SWJCFG_MASK;//将要配置的内容赋值给变量tmpreg
AFIO->MAPR &= DBGAFR_SWJCFG_MASK;//将SWJ_CFG控制位清零
}
else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK)
//配置有两个控制位复用重映射
{
tmp1 = ((uint32_t)0x03) << tmpmask;//找到要配置的位
tmpreg &= ~tmp1;//将要配置的内容赋值给变量tmpreg
tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg
}
else
//配置有1个控制位复用重映射
{
tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10));//将要配置的内容赋值给变量tmpreg
tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg
}
if (NewState != DISABLE)
{
tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10));//使能或失能某个外设的重映射
}
if((GPIO_Remap & 0x80000000) == 0x80000000)
{
AFIO->MAPR2 = tmpreg;
}
else
{
AFIO->MAPR = tmpreg;//将配置内容写到AFIO_MAPR寄存器中
}
}
新手第一次写博客,内容简介,分析不够深入,请见谅!
相关文章推荐
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
- Solr Schema.xml和solrconfig.xml分析(转)
- Linux2.6.36内核分析之CONFIG_SCHEDSTATS
- Linux内核配置以及Make menuconfig过程分析
- osworkflow的config代码分析
- CI源码分析(一)—config配置文件模块
- NDMCDB数据库hang住故障分析 - cursor: pin S wait on X
- linphone-LinphoneProxyConfigImpl文件对应的JNI层文件分析
- Debug目录、Release目录,bin目录、obj目录,vshost.exe.config文件、.exe.config文件分析【C#】
- Zend Framework教程之Zend_Config_Xml用法分析
- osworkflow的config代码分析
- 2010-1-3------mage_core_model_config------------construct过程----------------个人分析
- Web.config 和 App.config 的区别分析
- Web.config 和 App.config 的区别分析
- Cordova配置文件常用属性配置分析(config.xml)
- config.mk 文件详细分析
- 编译内核提示“Restart config..”的问题分析和解决
- Solr笔记(2)_Schema.xml和solrconfig.xml分析
- library cache pin和lock等待分析
- make menuconfig 常见错误分析