STM8L151x4引脚PC4无法正常输出高低电平

2019-07-19 20:56发布

如题,再用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]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
lsy3500
2019-07-20 02:07
本帖最后由 lsy3500 于 2017-3-1 09:05 编辑

已解决。
问题原因:
      如一楼数据手册图片所示,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现在设置成了时钟输出周期性的方波,所以即使拉高了一瞬间,他又开始输出方波,所以没有看到拉高或者拉低那一瞬间而已。因为身边暂时没有示波器,所以也没法看波形,所以才想应该就是这个原因了。)
      

一周热门 更多>