相信许多工程师对二极管压降的认识,仍然停留在模电书上的那句话:硅二极管的正向压降为0.6-0.7V,这句话很害人,它应该加上条件:正向测量电流。更多的人则了解PN结的伏安特性,即PN结压降与正向电流关系呈对数关系,如果说1mA时为0.6V, 10mA时为0.7V, 那么100mA, 1000mA 将可能对应0.82V及0.95V左右。实际上,以上关系只在小电流下成立,当电流较大时则要考虑二极管电阻分量的压降了,我们目前知道,二极管除了具有PN结,还具有半导体材料的体电阻,封装绑定线的电阻及引脚的电阻,这些电阻分量在几百mA至几A的情况下,压降是很明显的,可以认为,在小电流时主要由伏安特性决定压降,而大电流时则主要由体电阻决定压降。
最后还是放弃了二极管压降的方式,考虑用电阻分压,但负载阻抗的不确定,导致的分压结果也是不确定的,所以也行不通
仔细阅读手册,索性直接最低电压3.3v供电,经测试可以正常工作,反复测试稳定性很好,没出现问题。
这是第一次使用stm32的usart3进行串口通信,代码直接通过,没出现问题。串口设置代码如下:
/**********************************************
**串口配置函数,这里使能了3个串口,其中串口1,2使用了中断接收模式
**
**********************************************/
void USART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
//使能串口1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
/* A9 USART1_Tx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* A10 USART1_Rx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//使能串口2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
// A2 做T2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// A3 做R2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART2, &USART_ClockInitStructure);
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
//串口2使用接收中断
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
//使能串口3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
// PB10 做T3X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// PB11 做R3X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART3, &USART_ClockInitStructure);
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
}
void USART1_Putc(unsigned char c)
{
USART_SendData(USART1, c);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
void USART1_Puts(char * str)
{
while(*str)
{
USART_SendData(USART1, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
void USART1_Send_Byte(unsigned char byte) //串口发送一个字节
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1, byte); //通过库函数 发送数据
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
}
void USART1_Send_Str(unsigned char *s)//发送字符串 函数 应用指针 方法
{
unsigned char i=0; //定义一个局部变量 用来 发送字符串 ++运算
while(s[i]!='\0') // 每个字符串结尾 都是以 \0 结尾的
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1,s[i]); //通过库函数 发送数据
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
i++; //i++一次
}
}
/*------------串口1 发送数组数据 循环发送一个数组上去-------------------
程序示例:
uchar Tx_Data[15]; //定义数组 范围是:Tx_Data[0]-Tx_Data[14]
UART1_Send_Array(Tx_Data,6); //发送数组前6位数据 Tx_Data[0]-Tx_Data[5]
UART1_Send_Array(Tx_Data,15); //发送数组所有数据 Tx_Data[0]-Tx_Data[14]
------------------------------------------------------------------------*/
void USART1_Send_Array(unsigned char send_array[],unsigned char num) //两个参数 一是数组(的数据) 二是数组长度1-255
{
//串口发送
unsigned char i=0; //定义一个局部变量 用来 发送字符串 ++运算
while(i
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1,send_array[i]); //通过库函数 发送数据
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
i++; //值 加一
}
}
void USART2_Putc(unsigned char c)
{
USART_SendData(USART2, c);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
}
void USART2_Puts(char * str)
{
while(*str)
{
USART_SendData(USART2, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
}
void USART3_Putc(unsigned char c)
{
USART_SendData(USART3, c);
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET );
}
void USART3_Puts(char * str)
{
while(*str)
{
USART_SendData(USART3, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}
}
void USART3_Send_Byte(unsigned char byte) //串口发送一个字节
{
USART_ClearFlag(USART3,USART_FLAG_TC);
USART_SendData(USART3, byte); //通过库函数 发送数据
while( USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
}
void USART3_Send_Str(unsigned char *s)//发送字符串 函数 应用指针 方法
{
unsigned char i=0; //定义一个局部变量 用来 发送字符串 ++运算
while(s[i]!='\0') // 每个字符串结尾 都是以 \0 结尾的
{
USART_ClearFlag(USART3,USART_FLAG_TC);
USART_SendData(USART3,s[i]); //通过库函数 发送数据
while( USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
i++; //i++一次
}
}
void USART3_Send_Array(unsigned char send_array[],unsigned char num) //两个参数 一是数组(的数据) 二是数组长度1-255
{
//串口发送
unsigned char i=0; //定义一个局部变量 用来 发送字符串 ++运算
while(i
{
USART_ClearFlag(USART3,USART_FLAG_TC);
USART_SendData(USART3,send_array[i]); //通过库函数 发送数据
while( USART_GetFlagStatus(USART3,USART_FLAG_TC)!= SET);
//等待发送完成。 检测 USART_FLAG_TC 是否置1; //见库函数 P359 介绍
i++; //值 加一
}
}
春节过后继续完善其他部分,目前工作告一段落了。