| 
 
初级会员 
 
	积分176金钱176 注册时间2016-9-20在线时间56 小时 | 
 
 发表于 2016-11-8 17:57:18
|
显示全部楼层 
| [mw_shl_code=c,true]void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) {
 uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
 uint32_t tmpreg = 0x00, pinmask = 0x00;
 /* Check the parameters */
 assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
 assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
 assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
 
 /*---------------------------- GPIO Mode Configuration -----------------------*/
 currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
 if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
 {
 /* Check the parameters */
 assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
 /* Output mode */
 currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
 }
 /*---------------------------- GPIO CRL Configuration ------------------------*/
 /* Configure the eight low port pins */
 if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
 {
 tmpreg = GPIOx->CRL;
 for (pinpos = 0x00; pinpos < 0x08; pinpos++)
 {
 pos = ((uint32_t)0x01) << pinpos;
 /* Get the port pins position */
 currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
 if (currentpin == pos)
 {
 pos = pinpos << 2;
 /* Clear the corresponding low control register bits */
 pinmask = ((uint32_t)0x0F) << pos;
 tmpreg &= ~pinmask;
 /* Write the mode configuration in the corresponding bits */
 tmpreg |= (currentmode << pos);
 /* Reset the corresponding ODR bit */
 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
 {
 GPIOx->BRR = (((uint32_t)0x01) << pinpos);
 }
 else
 {
 /* Set the corresponding ODR bit */
 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
 {
 GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
 }
 }
 }
 }
 GPIOx->CRL = tmpreg;
 }
 /*---------------------------- GPIO CRH Configuration ------------------------*/
 /* Configure the eight high port pins */
 if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
 {
 tmpreg = GPIOx->CRH;
 for (pinpos = 0x00; pinpos < 0x08; pinpos++)
 {
 pos = (((uint32_t)0x01) << (pinpos + 0x08));
 /* Get the port pins position */
 currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
 if (currentpin == pos)
 {
 pos = pinpos << 2;
 /* Clear the corresponding high control register bits */
 pinmask = ((uint32_t)0x0F) << pos;
 tmpreg &= ~pinmask;
 /* Write the mode configuration in the corresponding bits */
 tmpreg |= (currentmode << pos);
 /* Reset the corresponding ODR bit */
 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
 {
 GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
 }
 /* Set the corresponding ODR bit */
 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
 {
 GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
 }
 }
 }
 GPIOx->CRH = tmpreg;
 }
 }
 [/mw_shl_code]
 这是GPIO_Init()函数,ODR还是要自己配置的吧?库函数的配置方式求解啊、、
 | 
 |