打印
[STM32F1]

基于STM32芯片的一款智能台灯

[复制链接]
楼主: junpeng324
手机看帖
扫描二维码
随时随地手机跟帖
61
mituzu| | 2017-11-11 22:31 | 只看该作者 回帖奖励 |倒序浏览
坐等楼主的整套的成果。

使用特权

评论回复
62
junpeng324|  楼主 | 2017-11-11 22:32 | 只看该作者
人体感应部分代码,实现了台灯的自动控制(有乱码)
#include "renti.h"
u8 start_job_flag,day_falg;
extern u16 hour;
extern float lx;
void renti_init()   //手势初始化
{
  GPIO_InitTypeDef GPIO_InitStructure;          //声明一个结构体变量,用来初始化GPIO

        /* 开启GPIO时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

/*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=renti|gd;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;         //上拉输入
        GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void renti_deal()  //人体感应
{
        if((hour>=8)&&(hour<=17))    //白天
        {
          day_falg=1;
        }
        if((hour>17)&&(hour<=22))    //工作时间
        {
          day_falg=2;
        }
        if((hour>22)&&(hour<24))    //休息时间
        {
         day_falg=3;
        }
        if((hour>=0)&&(hour<8))     //休息时间
        {
         day_falg=3;
        }
        if((RT==1)|(GD==0))  //人经过或者来学习是灯根据时间光照值来调节
        {

    switch(day_falg)
                 {
                   case 1:   TIM_SetCompare1(TIM5, 0);        break;   //白天关灯
                         case 2:   
                                         //工作时间根据光照值对灯光进行调节
                                  if(lx>2000)
                                                                {
                                                                 TIM_SetCompare1(TIM5, 0);   
                                                                }
                                                                else
                                                                {
                                                                        if((lx>2000))
                                                                        {
                                                                         TIM_SetCompare1(TIM5, 0);
                                                                        }
                                                                        if((lx<=2000)&&(lx>1000))
                                                                        {
                                                                         TIM_SetCompare1(TIM5, 100);
                                                                        }
                                                                        if((lx<=1000)&&(lx>500))
                                                                        {
                                                                         TIM_SetCompare1(TIM5, 500);
                                                                        }
                                                                        if((lx<=500)&&(lx>300))
                                                                        {
                                                                         TIM_SetCompare1(TIM5, 1000);
                                                                        }
                                                                  if((lx<=300)&&(lx>100))
                                                                        {
                                                                         TIM_SetCompare1(TIM5, 1500);
                                                                        }
                                                                        if((lx>0)&&(lx<=100))
                                                                        {
                                                                          TIM_SetCompare1(TIM5, 2000);
                                                                        }
                                                                }   
                                                                break;
                         case 3:    //休息时间也根据光照值对灯光进行调节
                                           
                TIM_SetCompare1(TIM5, 800);
                break;
                   }
  }
        if(GD==0)    //开始学习
        {
          start_job_flag=1;
        }
        if(GD==1)    //结束学习
        {
         start_job_flag=0;
        }
        if((start_job_flag==0)&&(RT==0))  //人离开短暂延时灯灭
        {
          led_off();  //关灯
        }
}


使用特权

评论回复
63
junpeng324|  楼主 | 2017-11-11 22:35 | 只看该作者
mituzu 发表于 2017-11-11 22:31
坐等楼主的整套的成果。

有优酷的视频可以参考下,我传优酷上面了。

使用特权

评论回复
64
mituzu| | 2017-11-11 22:35 | 只看该作者
亮度是怎么测定的?

使用特权

评论回复
65
junpeng324|  楼主 | 2017-11-11 22:35 | 只看该作者
人体感应头文件
#ifndef _renti_H
#define _renti_H
#include "stm32f10x.h"
#include "pwm/pwm.h"
#include "delay/delay.h"


#define gd GPIO_Pin_12       //PD12
#define renti GPIO_Pin_13    //PD13
#define GD GPIO_ReadInputDataBit(GPIOD,gd) //获取光电开关的状态
#define RT GPIO_ReadInputDataBit(GPIOD,renti)


void renti_init(void);
void renti_deal(void);




#endif


使用特权

评论回复
66
junpeng324|  楼主 | 2017-11-11 22:37 | 只看该作者
mituzu 发表于 2017-11-11 22:35
亮度是怎么测定的?

BH1750就可以啊,我们用的就是这个I2C的BH1750

使用特权

评论回复
67
junpeng324|  楼主 | 2017-11-11 22:39 | 只看该作者
亮度的测量我们用到了BH1750 基于I2C的模块,下面是I2C的驱动程序
#include "iic.h"

void iic_init(void)
{
        /*****配置GPIO口**************************************/
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOIIC, ENABLE);

        GPIO_InitStructure.GPIO_Pin=IIC_SCL_Pin|IIC_SDA_Pin;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
       
        GPIO_Init(GPIO_IIC, &GPIO_InitStructure);       
       
        /********将IIC的 SCL SDA 上拉释放总线******************/
        SDA_PIN_OUT=1;
        SCL_PIN_OUT=1;
}
/*
函数名:iic_start
功  能:启动iic,启动方式,在SCL高电平期间将SDA由高置低
参  数:无
返回值:无
*/
void iic_start(void)
{
        IIC_SDA_OUT();
        SDA_PIN_OUT=1;
        SCL_PIN_OUT=1;
        delay_us(1);
        SDA_PIN_OUT=0;
        delay_us(1);
        SCL_PIN_OUT=0;
}
/*
函数名:iic_stop
功  能:停止传输数据,实现方式在SCL高电平期间将SDA由低置高
参  数:无
返回值:无
*/
void iic_stop(void)
{
       
  SCL_PIN_OUT=0;
        IIC_SDA_OUT();       
        SDA_PIN_OUT=0;
        delay_us(1);
        SCL_PIN_OUT=1;
        SDA_PIN_OUT=1;
        delay_us(1);
}
/*
函数名:iic_ack
功  能:接收从机应答信号,释放掉总线读取SDA置看是否有负脉冲,
        当一段时间无应答默认接收完毕
参  数:无
返回值:无
*/
u8 iic_wait_ack(void)
{
        u8 i=0;
        IIC_SDA_IN();
    SDA_PIN_OUT=1;delay_us(1);
        SCL_PIN_OUT=1;delay_us(1);
        while(SDA_PIN_IN)
        {
                i++;
                if(i>250)
                {               
            iic_stop();                        //如果i>255则产生非应答信号,iic停止
                        return 1;
                }
               
        }
        SCL_PIN_OUT=0;//时钟输出0
        return 0;
}
/*
函数名:iic_nask
功  能:产生非应答信号
参  数:无
返  回:无
*/
void iic_nack(void)
{
        SCL_PIN_OUT=0;
        IIC_SDA_OUT();
        SDA_PIN_OUT=1;
        delay_us(1);
        SCL_PIN_OUT=1;
        delay_us(1);
        SCL_PIN_OUT=0;
}       
/*
函数名:iic_ask
功  能:产生ask应答
参  数:无
返  回:无
*/
void iic_ack(void)
{
        SCL_PIN_OUT=0;
        IIC_SDA_OUT();
        SDA_PIN_OUT=0;
        delay_us(1);
        SCL_PIN_OUT=1;
        delay_us(1);
        SCL_PIN_OUT=0;
}
/*
函数名:iic_bit_write
功  能:传送一个字节
参  数:u8
返回值:无
*/
void iic_byte_write(u8 buf)
{
    u8 i;
        IIC_SDA_OUT();
        SCL_PIN_OUT=0;
        for(i=1;i<=8;i++)
        {
                SDA_PIN_OUT=(buf>>(8-i))&0x01;
                delay_us(1);
                SCL_PIN_OUT=1;
                delay_us(1);
                SCL_PIN_OUT=0;
                delay_us(1);               
        }
}
/*
函数名:iic_bit_read
功  能:主机读取一个字节
参  数:ask
返回值:
*/
u8 iic_byte_read(unsigned char ask)
{
        unsigned char  i,buf=0;
        IIC_SDA_IN();
        for(i=0;i<8;i++)
        {
           SCL_PIN_OUT=0;
           delay_us(1);
           SCL_PIN_OUT=1;
           buf <<=1;
           if(SDA_PIN_IN)
                   buf++;
            delay_us(1);
        }
        if(!ask)
                iic_nack();
        else
                iic_ack();
        return buf;
}


使用特权

评论回复
68
junpeng324|  楼主 | 2017-11-11 22:40 | 只看该作者
I2C需要用到的头文件#ifndef __IIC__H_
#define __IIC__H_
#include "stm32f10x.h"
#include "sys/sys.h"
#include "delay/delay.h"

#define IIC_SCL_Pin  GPIO_Pin_4
#define IIC_SDA_Pin  GPIO_Pin_5
#define GPIO_IIC     GPIOG
#define RCC_APB2Periph_GPIOIIC RCC_APB2Periph_GPIOG

#define IIC_SDA_OUT()  {GPIOG->CRL&=0XFF0FFFFF;GPIOG->CRL|=0x00300000;}//输入模式上拉下拉输入模式
#define IIC_SDA_IN()   {GPIOG->CRL&=0XFF0FFFFF;GPIOG->CRL|=0x00800000;}//通用推挽输出50MZ

#define SDA_PIN_OUT       PGout(5)
#define SCL_PIN_OUT       PGout(4)
#define SDA_PIN_IN        PGin(5)

void iic_init(void);
void iic_start(void);
void iic_stop(void);
u8 iic_wait_ack(void);
void iic_byte_write(u8 buf);
u8 iic_byte_read(unsigned char ask);
void iic_page_write(u8 device_address,u8 word_address,u8 byte_num,u8 *send_buff);
void iic_nbyte_read(u8 device_address,u8 word_address,u8 byte_num ,u8 *receive_buff);

void AT24_onebyte_write(u8 device_address,u8 word_address,u8 send_buff);
u8  AT24_onebyte_read(u8 device_address,u8 word_address);
void AT24_nbyte_read(u8 device_address,u8 word_address,u8 num,u8 *receive_buf);
#endif




使用特权

评论回复
69
junpeng324|  楼主 | 2017-11-11 22:43 | 只看该作者
BH1750的驱动程序,基于I2C
#include "delay/delay.h"
#include "BH1750.h"
void bh_data_send(u8 command)
{
    do{
    iic_start();
    iic_byte_write(BHAddWrite);
        }while(iic_wait_ack());
        iic_byte_write(command);
        iic_wait_ack();
        iic_stop();
}


u16 bh_data_read(void)
{
        u16 buf;
        iic_start();
        iic_byte_write(BHAddRead);
        iic_wait_ack();
        buf=iic_byte_read(1);
        buf=buf<<8;
        buf+=0x00ff&iic_byte_read(0);
        iic_stop();
        return buf;
}
float read_lx()        //采集光照值
{
    float datalx;
          
          datalx =bh_data_read()/1.2;
          return datalx;


}


使用特权

评论回复
70
junpeng324|  楼主 | 2017-11-11 22:43 | 只看该作者
BH1750需要的头文件
#ifndef __BH1750__H_
#define __BH1750__H_
#include "stm32f10x.h"
#include "iic/iic.h"
#include "sys/sys.h"
#include "delay/delay.h"
/*************************************************************/

#define BHAddWrite     0x46      //从机地址+最后写方向位
#define BHAddRead      0x47      //从机地址+最后读方向位
#define BHPowDown      0x00      //关闭模块
#define BHPowOn        0x01      //打开模块等待测量指令
#define BHReset        0x07      //重置数据寄存器值在PowerOn模式下有效
#define BHModeH1       0x10      //高分辨率 单位1lx 测量时间120ms
#define BHModeH2       0x11      //高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL        0x13      //低分辨率 单位4lx 测量时间16ms
#define BHSigModeH     0x20      //一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BHSigModeH2    0x21      //同上类似
#define BHSigModeL     0x23      // 上类似
/*************************************************************/
void bh_data_send(u8 command);
u16 bh_data_read(void);
void bh1750_init(void);
float read_lx(void);
#endif


使用特权

评论回复
71
junpeng324|  楼主 | 2017-11-11 22:45 | 只看该作者
@21IC小喇叭赶紧推荐吧

使用特权

评论回复
72
dingbo95| | 2017-11-11 22:47 | 只看该作者

看着挺霸气啊,功能很全的台灯。

使用特权

评论回复
73
dingbo95| | 2017-11-11 22:48 | 只看该作者
junpeng324 发表于 2017-11-9 23:08
APP页面:局部图 灯光控制主界面

APP很不错,这个GUI做的很牛啊。

使用特权

评论回复
74
一路向北lm| | 2017-11-12 12:27 | 只看该作者
很不错的分享,学习一下。

使用特权

评论回复
75
877049204| | 2017-11-12 19:37 | 只看该作者
不错

使用特权

评论回复
76
junpeng324|  楼主 | 2017-11-12 22:23 | 只看该作者

相互学习,错了欢迎指正。

使用特权

评论回复
77
junpeng324|  楼主 | 2017-11-12 22:25 | 只看该作者
一路向北lm 发表于 2017-11-12 12:27
很不错的分享,学习一下。

相互学习,错了欢迎指正,

使用特权

评论回复
78
junpeng324|  楼主 | 2017-11-12 22:32 | 只看该作者
dingbo95 发表于 2017-11-11 22:48
APP很不错,这个GUI做的很牛啊。

APP写了好多天,心酸啊。

使用特权

评论回复
79
junpeng324|  楼主 | 2017-11-12 22:35 | 只看该作者
#include <stdio.h>
#include <string.h>
#include "Hal_Usart/hal_uart.h"
#include "gizwits_protocol.h"
#include "public/public.h"


/**@} */
/**@name Gizwits 用户API接口
* @{
*/
extern dataPoint_t currentDataPoint;
/**
* @brief 事件处理接口

* 说明:

* 1.用户可以对WiFi模组状态的变化进行自定义的处理

* 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口

* @param[in] info : 事件队列
* @param[in] data : 协议数据
* @param[in] len : 协议数据长度
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{
  uint8_t i = 0;
  dataPoint_t *dataPointPtr = (dataPoint_t *)data;
  moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)data;
  protocolTime_t *ptime = (protocolTime_t *)data;

  if((NULL == info) || (NULL == data))
  {
    return -1;
  }

  for(i=0; i<info->num; i++)
  {
    switch(info->event)
    {
      case EVENT_LAMP_POWER:
        currentDataPoint.valueLamp_Power = dataPointPtr->valueLamp_Power;
        GIZWITS_LOG("Evt: EVENT_LAMP_POWER %d \n", currentDataPoint.valueLamp_Power);
        if(0x01 == currentDataPoint.valueLamp_Power)
        {
          //app    开灯命令
                                        led_app_flag=1;
                                  led_flag=1;
                                       
        }
        else
        {
          //app    关灯命令
                                        led_app_flag=1;
          led_flag=0;                       
        }
        break;
      case EVENT_LAMP_AUTO_CONTROL:
        currentDataPoint.valueLamp_Auto_Control = dataPointPtr->valueLamp_Auto_Control;
        GIZWITS_LOG("Evt: EVENT_LAMP_AUTO_CONTROL %d \n", currentDataPoint.valueLamp_Auto_Control);
        if(0x01 == currentDataPoint.valueLamp_Auto_Control)
        {
          //app模式切换   自动模式
                                        mode_flag=1;
                                }
        else
        {
          //手动模式
                                        mode_flag=0;
                                }
        break;
      case EVENT_POLE_SWITCH:
        currentDataPoint.valuePole_Switch = dataPointPtr->valuePole_Switch;
        GIZWITS_LOG("Evt: EVENT_POLE_SWITCH %d \n", currentDataPoint.valuePole_Switch);
        if(0x01 == currentDataPoint.valuePole_Switch)
        {
          //user handle
        }
        else
        {
          //user handle   
        }
        break;
      case EVENT_HUMAN_BODY_SWITCH:
        currentDataPoint.valueHuman_Body_Switch = dataPointPtr->valueHuman_Body_Switch;
        GIZWITS_LOG("Evt: EVENT_HUMAN_BODY_SWITCH %d \n", currentDataPoint.valueHuman_Body_Switch);
        if(0x01 == currentDataPoint.valueHuman_Body_Switch)
        {
          //user handle
        }
        else
        {
          //user handle   
        }
        break;
      case EVENT_TIMING_SWITCH:
        currentDataPoint.valueTiming_Switch = dataPointPtr->valueTiming_Switch;
        GIZWITS_LOG("Evt: EVENT_TIMING_SWITCH %d \n", currentDataPoint.valueTiming_Switch);
        if(0x01 == currentDataPoint.valueTiming_Switch)
        {
          //user handle
        }
        else
        {
          //user handle   
        }
        break;


      case EVENT_LAMP_SIZE:
        currentDataPoint.valueLamp_Size = dataPointPtr->valueLamp_Size;
        GIZWITS_LOG("Evt:EVENT_LAMP_SIZE %d\n",currentDataPoint.valueLamp_Size);

                          //app 调光标志位
                          led_app_flag=1;

                       
        break;
      case EVENT_TIMING_SIZE:
        currentDataPoint.valueTiming_Size = dataPointPtr->valueTiming_Size;
        GIZWITS_LOG("Evt:EVENT_TIMING_SIZE %4f\n",currentDataPoint.valueTiming_Size);
        //user handle
        break;
      case EVENT_LAMP_MODEL:
        currentDataPoint.valueLamp_Model = dataPointPtr->valueLamp_Model;
        GIZWITS_LOG("Evt:EVENT_LAMP_MODEL %d\n",currentDataPoint.valueLamp_Model);
        //user handle
        break;
      case EVENT_TODAY_DATE:
        currentDataPoint.valueToday_Date = dataPointPtr->valueToday_Date;
        GIZWITS_LOG("Evt:EVENT_TODAY_DATE %d\n",currentDataPoint.valueToday_Date);
        //user handle
        break;
      case EVENT_NOW_TIME:
        currentDataPoint.valueNow_Time = dataPointPtr->valueNow_Time;
        GIZWITS_LOG("Evt:EVENT_NOW_TIME %d\n",currentDataPoint.valueNow_Time);

//                           settime_flag=1;
                        //user handle
        break;


      case WIFI_SOFTAP:
        break;
      case WIFI_AIRLINK:
        break;
      case WIFI_STATION:
        break;
      case WIFI_CON_ROUTER:
        break;
      case WIFI_DISCON_ROUTER:
        break;
      case WIFI_CON_M2M:
        break;
      case WIFI_DISCON_M2M:
        break;
      case WIFI_RSSI:
        GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
        break;
      case TRANSPARENT_DATA:
        GIZWITS_LOG("TRANSPARENT_DATA \n");
        //user handle , Fetch data from [data] , size is [len]
        break;
      case WIFI_NTP:
        GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
        break;
      default:
        break;
    }
  }

  return 0;
}



/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零

* @param none
* @return none
*/
static uint32_t timerMsCount;
void gizTimerMs(void)
{
    timerMsCount++;
}

/**
* @brief 读取系统时间毫秒计时数

* @param none
* @return 系统时间毫秒数
*/
uint32_t gizGetTimerCount(void)
{
    return timerMsCount;
}


/**
* @brief MCU复位函数

* @param none
* @return none
*/
void mcuRestart(void)
{
    __set_FAULTMASK(1);
    NVIC_SystemReset();
}

/**@} */

/**
* @brief 定时器TIM3中断处理函数

* @param none
* @return none
*/
void TIMER_IRQ_FUN(void)
{
    if (TIM_GetITStatus(TIMER, TIM_IT_Update) != RESET)  
    {
        TIM_ClearITPendingBit(TIMER, TIM_IT_Update  );
        gizTimerMs();
    }
}

/**
* @brief 定时器TIM3定时器初始化

* @param none
* @return none
*/
void timerInit(void)
{
    u16 arr = 7199;
    u16 psc = 9;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(TIMER_RCC, ENABLE); //时钟使能

    //定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIMER, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位0

    TIM_ITConfig(TIMER, TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIMER_IRQ;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //优占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
    TIM_Cmd(TIMER, ENABLE);  //使能TIMx
}

/**
* @brief USART2串口中断函数

* 接收功能,用于接收与WiFi模组间的串口协议数据
* @param none
* @return none
*/
void UART_IRQ_FUN(void)
{
    uint8_t value = 0;
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
        value = USART_ReceiveData(USART2);

        gizPutData(&value, 1);
    }
}


/**
* @brief 串口写操作,发送数据到WiFi模组
*
* @param buf      : 数据地址
* @param len       : 数据长度
*
* @return : 正确返回有效数据长度;-1,错误返回
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;

    if(NULL == buf)
    {
        return -1;
    }
#ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
#endif

    for(i=0; i<len; i++)
    {
        USART_SendData(UART, buf);
        while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);//Loop until the end of transmission
#ifdef PROTOCOL_DEBUG
        GIZWITS_LOG("%02x ", buf);
#endif
        if(i >=2 && buf == 0xFF)
        {
          USART_SendData(UART,0x55);
          while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);//Loop until the end of transmission
#ifdef PROTOCOL_DEBUG
        GIZWITS_LOG("%02x ", 0x55);
#endif
        }
    }

#ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("\n");
#endif

    return len;
}

/**
* @brief USART串口初始化

* 用于与WiFi模组间的串口通信
* @param none
* @return none
*/
void uartInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    UART_GPIO_Cmd(UART_GPIO_CLK, ENABLE);
    UART_CLK_Cmd(UART_CLK, ENABLE);
    UART_AFIO_Cmd(UART_AFIO_CLK, ENABLE);

    GPIO_InitStructure.GPIO_Pin = UART_TxPin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = UART_RxPin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = UART_BAUDRATE;
    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_Init(UART, &USART_InitStructure);

    USART_ITConfig(UART,USART_IT_RXNE,ENABLE);
    USART_Cmd(UART, ENABLE);
    USART_ClearFlag(UART, USART_FLAG_TC); /*清空发送完成标志,Transmission Complete flag */

    /*使能串口中断,并设置优先级*/
    NVIC_InitStructure.NVIC_IRQChannel = UART_IRQ;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


使用特权

评论回复
80
junpeng324|  楼主 | 2017-11-12 22:36 | 只看该作者
/**
************************************************************
* @file         gizwits_product.h
* @brief        对应gizwits_product.c的头文件(包含产品软硬件版本定义)
* @author       Gizwits
* @date         2016-09-05
* @version      V0.1.2
* @CopyRight    Gizwits
*
* @NOTE         机智云.只为智能硬件而生
*               Gizwits Smart Cloud  for Smart Products
*               链接|增值ֵ|开放|中立|安全|自有|自由|生态
*               www.gizwits.com
*
***********************************************************/
#ifndef _GIZWITS_PRODUCT_H
#define _GIZWITS_PRODUCT_H

#include <stdint.h>
#include <stm32f10x.h>


/**
* @name 日志打印宏定义
* @{
*/
#define GIZWITS_LOG printf                          ///<运行日志打印
//#define PROTOCOL_DEBUG                              ///<协议数据打印

#ifndef ICACHE_FLASH_ATTR
#define ICACHE_FLASH_ATTR
#endif

/**@} */

#define typedef_t __packed typedef

/**
* MCU软件版本号
*/
#define SOFTWARE_VERSION "03010101"
/**
* MCU硬件版本号
*/
#define HARDWARE_VERSION "03010100"

#ifndef SOFTWARE_VERSION
    #error "no define SOFTWARE_VERSION"
#endif

#ifndef HARDWARE_VERSION
    #error "no define HARDWARE_VERSION"
#endif

/**@name TIM3相关宏定义
* @{
*/
#define TIMER                                         TIM3
#define TIMER_IRQ                                 TIM3_IRQn
#define TIMER_RCC                                 RCC_APB1Periph_TIM3
#define TIMER_IRQ_FUN                         TIM3_IRQHandler
/**@} */

/**@name USART相关宏定义
* @{
*/
#define UART_BAUDRATE                         9600
#define UART_PORT                             2
#define UART                                  USART2
#define UART_IRQ                              USART2_IRQn
#define UART_IRQ_FUN                          USART2_IRQHandler

#if (UART_PORT == 1)
#define UART_GPIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_GPIO_CLK          RCC_APB2Periph_GPIOA

#define UART_AFIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_AFIO_CLK          RCC_APB2Periph_AFIO

#define UART_CLK_Cmd           RCC_APB2PeriphClockCmd
#define UART_CLK               RCC_APB2Periph_USART1

#define UART_GPIO_PORT         GPIOA
#define UART_RxPin             GPIO_Pin_10
#define UART_TxPin             GPIO_Pin_9
#endif

#if (UART_PORT == 2)
#define UART_GPIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_GPIO_CLK          RCC_APB2Periph_GPIOA

#define UART_AFIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_AFIO_CLK          RCC_APB2Periph_AFIO

#define UART_CLK_Cmd           RCC_APB1PeriphClockCmd
#define UART_CLK               RCC_APB1Periph_USART2

#define UART_GPIO_PORT         GPIOA
#define UART_RxPin             GPIO_Pin_3
#define UART_TxPin             GPIO_Pin_2
#endif


#if (UART_PORT == 3)

#define UART_GPIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_GPIO_CLK          RCC_APB2Periph_GPIOC

#define UART_AFIO_Cmd          RCC_APB2PeriphClockCmd
#define UART_AFIO_CLK          RCC_APB2Periph_AFIO

#define UART_CLK_Cmd           RCC_APB1PeriphClockCmd
#define UART_CLK               RCC_APB1Periph_USART3

#define UART_GPIO_PORT         GPIOC
#define UART_RxPin             GPIO_Pin_11
#define UART_TxPin             GPIO_Pin_10

#endif
/**@} */

/**@name 设备状态数据上报间隔时间宏定义
* @{
*/
#define REPORT_TIME_MAX 6000 //6S
/**@} */

void timerInit(void);
void uartInit(void);
void mcuRestart(void);
int32_t uartWrite(uint8_t *buf, uint32_t len);

/**@name Gizwits 用户API接口
* @{
*/
//int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len);
/**@} */

#endif


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则