STM32基础入门

任务描述

编程实现以下功能:

1.创建CUBMAX工程,并用Keil修改程序,编译后下载到M3,当程序启动时,LED9开始闪烁。(1)

2.使用定时器实现,每过1秒LED1、LED3、LED5、LED7、依次亮起,后灯亮起时,前灯灭。(1)

3.在M3上选择适当引脚连接继电器,继电器控制灯泡。当KEY1键按下,灯泡亮,KEY2按下灯泡灭(1)

4扩展试题

M3模块连接光照传感器,采集到的光照数据通过USART5发送到云平台,使云台出现光照数据。(2)

光明传感器发往物联网网关的帧协议格式如下:

说明

START

ADDR

CMD

LEN

TYPE

DATA

CheckSum

长度

1Byte

2Byte

1Byte

1Byte

1Byte

2Byte

1Byte

0xDD

0x0001

0x02

0x0x09

0x06

 

 

注:2字节时先发高位。

 

一、设备

  • M3模块1个
  • 双联继电器一块
  • 灯泡一个
  • 物联网王网关一个
  • 导线若干

二、任务描述

2.1 创建CUBMAX工程,并用Keil修改程序,编译后下载到M3,当程序启动时,LED9开始闪烁

 生成工程,添加代码

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        HAL_GPIO_TogglePin(LED9_GPIO_Port,LED9_Pin);
        HAL_Delay(500);

2.2、使用定时器实现,每过1秒LED1、LED3、LED5、LED7、依次亮起,后灯亮起时,前灯灭。

 

 

 生成代码

 /* USER CODE BEGIN 2 */
    //启动定时器
    if(HAL_TIM_Base_Start_IT(&htim6)!=HAL_OK)
    {
        Error_Handler();
    }
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
//定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    //是否
    if(TIM6 == htim->Instance)
    {
        
        num = num>>2;
        if(num == 0)
            num = 0x80;
        HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOE,num,GPIO_PIN_RESET);
    }
}

2.3、在M3上选择适当引脚连接继电器,继电器控制灯泡。当KEY1键按下,灯泡亮,KEY2按下灯泡灭

 

 

 

 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin & GPIO_PIN_13)
    {
        //keydown_flag = 1;
        //count +=1;
        HAL_Delay(300);
        HAL_GPIO_WritePin(GPIOE,Relay_Pin,GPIO_PIN_SET);
        //keydown_flag = 0;
    }
}

//判断引脚PD13是否为高电平
        if((~GPIOD->IDR)& GPIO_IDR_IDR13)
        {
            //是高电平让引脚PE为低电平,从而使灯泡熄灭
            HAL_GPIO_WritePin(GPIOE,Relay_Pin,GPIO_PIN_RESET);
        }

2.4、扩展试题

3模块连接光照传感器,采集到的光照数据通过USART5发送到云平台,使云台出现光照数据。(2)

光明传感器发往物联网网关的帧协议格式如下:

说明

START

ADDR

CMD

LEN

TYPE

DATA

CheckSum

长度

1Byte

2Byte

1Byte

1Byte

1Byte

2Byte

1Byte

0xDD

0x0001

0x02

0x0x09

0x06

 

 

注:2字节时先发高位。

 

 

     //HAL_Delay(1000);
  //light
        pushbuf[0]=0xDD;    //开头
        pushbuf[1]=0x06;    //地址位
        pushbuf[2]=0x00;
        pushbuf[3]=0x02;    //命令码 0x02RS485,0x01CAN
        pushbuf[4]=0x09;    //长度
        pushbuf[5]=0x06;    //传感器类型
        pushbuf[6]=Get_Voltage()*10>>8;        //数据位,高八位
        pushbuf[7]=Get_Voltage()*10&0xFF;    //第八位
        pushbuf[8]=CHK(pushbuf,8);            //校验位
        HAL_UART_Transmit(&huart5,pushbuf,9,0xffff);
        
        }
static uint8_t CHK(const uint8_t *buf, uint8_t len)
{
    uint8_t  RX_CHX=0;
    while(len--) {
        RX_CHX+= *buf;
        buf++;
    }
    return RX_CHX&=0xff;
}


uint16_t Get_Voltage(void)
{
    uint16_t voltage;
    uint16_t adcx=0;
    HAL_ADC_Start(&hadc1);  //启动ADC
    HAL_ADC_PollForConversion(&hadc1,10); //等待采集完成
    adcx = HAL_ADC_GetValue(&hadc1); //获取ADC采集数据
    voltage=(adcx*330)/4096; //将采集到的数据转换为电压值
    HAL_ADC_Stop(&hadc1); //停止ADC
    return voltage;
}
posted @ 2019-12-28 20:06  DingJie1024  阅读(1180)  评论(0编辑  收藏  举报