一个适合单片机初学者的娱乐(二、stm32程序编写)

        PCB板画好,手动焊接好,下面进行板子测试,首先给板子通电,查看是否有短路不正常的地方,之后进行下载代码调试程序。

        stm32程序编写,一般使用keil 5软件,当然也可以采用其他 VS code 等。stm32编写程序一般有三种,直接操作寄存器,标准库,HAL库方式。每种都有优点和缺点,可以根据实际需要采用合适的方式。我们为了方便,采用STM32CubeMX直接生成可执行代码方式,这种方式是目前主流方式。

        STM32CubeMx软件,Keil5软件使用就不过多介绍,直接搜索使用方式就可以了。下面直接讲解stm32f103代码的实现。对于单片机而言,我们只要了解了一种,例如 stm32 、51、NXP等,其他类似国产的单片机学习时,无非是寄存器不一样,操作方式都是一样的,uart /i2c/spi等接口协议都是一样的,不一样的无非是提供的操作库不一样,但都是调用相应的接口,目的都是操作寄存器,控制寄存器。基本是学好一种,在学习其他的就很方便了。

        首先讲解代码功能实现:

        1.PC通过USB转串口与stm32f103 uart1 通信,将wifi ssid 和Password 发送给stm32f103

        2.stm32f103将wifi 密码和wifi 名称 ,以明文方式存放入at24c02中

        3.stm32f103通过uart2 与esp32通信,将M1601B 测到的温度传输给esp32,esp32将温度数据上传给OneNet

        4.OneNet下发控制LED灯的亮灭指令,esp32接收指令转发给stm32f103进行LED灯控制亮灭

        下面是stm32代码框架:

        下面分别讲解一下代码:

        1. led.c

            led灯控制很简单,之前的电路中设计是由I/O口控制的,只需让I/O输出高低电平即可实现led亮灭控制。根据电路配置相应的I/O引脚为 推挽输出,然后使用HAL_GPIO_WritePin()函数实现相应I/O引脚的高低电平输出,代码如下:

#include "led.h"

/**--- LED GPIO Init -----------*/
void MX_LED_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, LED0_Pin|LED1_Pin|LED2_Pin|LED3_Pin, GPIO_PIN_RESET);
	
	 /*Configure GPIO pins : LED0_Pin LED1_Pin LED2_Pin LED3_Pin */
  GPIO_InitStruct.Pin = LED0_Pin|LED1_Pin|LED2_Pin|LED3_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/** LED灯测试程序 **/
void LedOnORoff_Func(void)
{
	uint8_t i=0;
	for( i=0; i<4; i++ )
	{
		//LED ON
		 HAL_GPIO_WritePin(GPIOC, LED(i),  GPIO_PIN_SET);
		 printf("led%d on !\n", i);
	   HAL_Delay(500);
	}

	for( i=4; i>0; i-- )
	{
		//LED ON
		 HAL_GPIO_WritePin(GPIOC, LED(i-1),  GPIO_PIN_RESET);
		 printf("led%d on !\n", i);
	   HAL_Delay(500);
	}
	
}




2. key.c

        按键采用边沿检测方式,检测按键是否被按下,外部中断处理函数中,按键按下后,改变flag值,并打印信息

#include "key.h"

extern KEY_Properties    stKEYProp;

void MX_KEY_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
	__HAL_RCC_GPIOB_CLK_ENABLE();
	
	#if ( __KEY_MODE_EXTI == 1)
	/*Configure GPIO pin : KEY_Pin */
  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING ;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
	
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);

#else
  /*Configure GPIO pin : KEY_Pin */
  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
#endif

}	

void KeyCheck_Func(void)
{
	//EXIT 
	if( GPIO_PIN_RESET == HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin))
	{
		HAL_Delay(5u);
		if( GPIO_PIN_RESET == HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin))
		{
			 printf("key push !\n");
		}
		else {
			 printf("key release !\n");
		}
	}
	else {
			printf("key release !\n");
	}
 
	HAL_Delay(500u); 
}



/**
  * @brief EXTI line detection callbacks
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 
	if(GPIO_Pin == KEY_Pin )
	{
		 stKEYProp.keystatus = KEY_Press;
		 printf("key push\n");
	}

}





 

3.uart.c

        uart操作中,uart1与usb相连,uart2与esp32 uart2相连。uart1 配置为 波特率 115200,1 bit 停止位,无奇偶检验,8 bit 数据位。uart2与uart1一样,只不过uart2采用中断接收,处理自定义的指令格式。

#include "uart.h"

/* Private function prototypes ------------------------------------*/
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

usartRWType_t usart2RW = {0};
static uint8_t swFlag =0;

static void MX_UART1_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();


  /*Configure GPIO pin : TX1_Pin */
  GPIO_InitStruct.Pin = TX1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(TX1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : RX1_Pin */
  GPIO_InitStruct.Pin = RX1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
  //GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(RX1_GPIO_Port, &GPIO_InitStruct);

}


static void MX_UART2_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();


  /*Configure GPIO pin : TX2_Pin */
  GPIO_InitStruct.Pin = TX2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(TX2_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : RX2_Pin */
  GPIO_InitStruct.Pin = RX2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
  //GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(RX2_GPIO_P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值