TA的每日心情 | 开心 2019-11-19 16:54 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 jacky401 于 2022-11-28 10:50 编辑
问题:
1,“OLED屏与mcu之间是通过GPIO口 PB10、PB11模拟IIC与MCU通信,那么用作IIC的GPIO如何配置?“
2,“这个switch.V3.3就是PB13拉高了之后也不会关机但是供电电压降低到2.5V”,不能拉低?
3, 代码验证
问题1解答:
一般作为IIC 接口的GPIO口不管是复用功能(硬IIC)还模拟的都应配置为推拉模式(GPIO_MODE_OUTPUT_PP),其它模式可能会失败;
同时 ,由于GPIO的负载能力十分有些,电路上一般要接上拉电阻(典型的如10K)。详细内容请参考GPIO原理部分内容 https://www.eda365.com/thread-226842-1-2.html。
问题2解答:
实验表明, PB13即使置为高电平,PMOS的电压为2.5V, 仍为逻辑高,但量测MCU端电平已反转,后查明为GPIO连接灌入电流;
去掉UART1、UART2的两个跳线帽, 首先实现OLED IIC是关断PMOS, 通过将GPIO方式配置为OD 、INPUT,并强制拉低发现,
PB13如下配置可以关断点亮OLED
void GPIO_OLED_Reset(uint8_t flag)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(flag)
{//reset to OD
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
else{//set
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
进一步发现UART也需要如此配置,才能关断
void HAL_USART_Reset(uint8_t flag)
{
GPIO_InitTypeDef GPIO_InitStruct;
if( flag )
{//reset to OD
if(&huart1 != NULL){
GPIO_InitStruct.Pin = Log_TX_Pin|Log_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
if(&huart2 != NULL){
GPIO_InitStruct.Pin = UART2TX_NBRX_Pin|UART2RX_NBTX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
else{//set
if(&huart1 != NULL){
GPIO_InitStruct.Pin = Log_TX_Pin|Log_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
if(&huart2 != NULL){
GPIO_InitStruct.Pin = UART2TX_NBRX_Pin|UART2RX_NBTX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
}
问题3解答:
断开USB连线,烧录hex文件,OLED正常显示后按“KEY2”切换, OLED量屏或息屏
|
|