Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101853
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-29 17:53
个人简介

坚持不懈的努力,从容不迫的追求

文章分类

全部博文(14)

文章存档

2013年(14)

我的朋友

分类: 嵌入式

2013-02-05 15:25:47

今天的调试除了语音模块供电部分耽误了半天时间外,其他部分很顺利
1n4007压降的问题一直没明白原因,换成4148测试也是压降不到0.7v。串联2个4007也没有达到0.7v的效果
这篇文章记录一下

谈谈二极管压降认识的误区

相信许多工程师对二极管压降的认识,仍然停留在模电书上的那句话:硅二极管的正向压降为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++;  //值 加一        
        }
       
}


春节过后继续完善其他部分,目前工作告一段落了。
阅读(1195) | 评论(0) | 转发(0) |
0

上一篇:养与育

下一篇:为何要重拾英语

给主人留下些什么吧!~~