如题,再用STM8L151x4芯片,想要用引脚PC4作为通用IO口输出高低电平,但是无法正常输出。用万用表测的时候发现电平时钟在1.5V、1.6V左右,拉高也无法拉高,拉低也无法拉低,
一开始用的推挽输出,发现没用,给焊接了一个10K的上拉电阻改用开漏输出,还是不行。
板子上现在外漏的引脚有PC0、1、2、3、4,PC0123都可以正常拉高拉低,但是唯独PC4不行,
求大神围观。
难道默认不是通用GPIO口的功能,而是其他功能比如USART1之类的?
附图是我从手册里摘出来的STM8L151的PC4的引脚功能描述。
这是我的部分程序:
[mw_shl_code=applescript,true]
GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Slow);
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
Delay(0x0FF);
Delay(0x0FF);
GPIO_SetBits(GPIOC, GPIO_Pin_4);
Delay(0x0FF);
Delay(0x0FF);
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已解决。
问题原因:
如一楼数据手册图片所示,PC4引脚有一个功能是usart1的时钟控制功能,而程序里面最开始进入while(1)之前初始化的时候有这一句:
[mw_shl_code=c,true]CLK_CCOConfig(CLK_CCOSource_HSI,CLK_CCODiv_64);[/mw_shl_code]
追了一下代码,发现这个函数的介绍:
[mw_shl_code=c,true]/**
* @brief Selects the clock source to output on CCO pin(PC4).
* @note PC4 should be configured output push-pull with the speed that matches
* maximum output speed of the desired clock.
* @param CLK_CCOSource: specifies the clock source to output.
* This parameter can be one of the following values:
* @arg CLK_CCOSource_Off: No clock selected as CCO source
* @arg CLK_CCOSource_HSI: HSI clock selected as CCO source
* @arg CLK_CCOSource_LSI: LSI clock selected as CCO source
* @arg CLK_CCOSource_LSE: LSE clock selected as CCO source
* @arg CLK_CCOSource_HSE: HSE clock selected as CCO source
* @param CLK_CCODiv: specifies the CCO prescaler.
* This parameter can be one of the following values:
* @arg CLK_CCODiv_1: no division applied to CCO clock
* @arg CLK_CCODiv_2: division by 2 applied to CCO clock
* @arg CLK_CCODiv_4: division by 4 applied to CCO clock
* @arg CLK_CCODiv_8: division by 8 applied to CCO clock
* @arg CLK_CCODiv_16: division by 16 applied to CCO clock
* @arg CLK_CCODiv_32: division by 32 applied to CCO clock
* @arg CLK_CCODiv_64: division by 64 applied to CCO clock
* @retval None
*/
void CLK_CCOConfig(CLK_CCOSource_TypeDef CLK_CCOSource, CLK_CCODiv_TypeDef CLK_CCODiv)
{
/* check teh parameters */
assert_param(IS_CLK_OUTPUT(CLK_CCOSource));
assert_param(IS_CLK_OUTPUT_DIVIDER(CLK_CCODiv));
/* Selects the source provided on cco_ck output and its divider*/
CLK->CCOR = (uint8_t)((uint8_t)CLK_CCOSource | (uint8_t)CLK_CCODiv);
}[/mw_shl_code]
可以看到,这个函数的作用是选择PC4作为输出时钟源,所以PC4不再是通用IO口输出了。
至于无法拉高也无法拉低的情况,原因猜想:
因为是时钟输出,所以输出为周期性的方波,也就是用万用表测的时候,测出来的是平均值,所以测出来是1.5V、1.7V左右(约为0V~3.3V的中间值),电平即无法拉高也无法拉低。
(PS:事实上,可能拉高拉低的时候成功了,但是因为PC4现在设置成了时钟输出周期性的方波,所以即使拉高了一瞬间,他又开始输出方波,所以没有看到拉高或者拉低那一瞬间而已。因为身边暂时没有示波器,所以也没法看波形,所以才想应该就是这个原因了。)
一周热门 更多>