目录
一、类型定义
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef long int int64_t;
typedef long long int int64_t;
/* Unsigned. */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;
typedef unsigned long long int uint64_t;
二、流水灯
/* USER CODE BEGIN PV */
uint16_t num=0x01;
/* USER CODE END PV */
/* 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) //判断是哪个定时器
{
HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,num,GPIO_PIN_RESET);
num=num<<1; /0000000100000000 0000000010000000
if(num==0x100)
num=0x01;
}
}
/* USER CODE END 4 */
三、按键,pwm
/* USER CODE BEGIN PV */
uint8_t keydown_flag = 0;
uint16_t pwm_value = 0;
uint8_t up_down_flag = 0;
/* USER CODE END PV */
1、pwm
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3); //打开定时器4的3通道
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if (keydown_flag == 1)
{
HAL_Delay(20);
if(pwm_value == 0)
{
up_down_flag = 0;
}
if(pwm_value == 50)
{
up_down_flag = 1;
}
if(up_down_flag == 0)
{
pwm_value++;
}
else
{
pwm_value--;
}
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,pwm_value); //实现亮灭程度
}
else
{
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,0); //灭
}
2、按键
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //中断
{
if(GPIO_Pin & GPIO_PIN_13) //判断是哪个按键
{
if (keydown_flag == 0)
{
keydown_flag = 1;
}
else
{
keydown_flag = 0;
}
pwm_value = 0;
}
}
/* USER CODE END 4 */
四、USART
改:stm32f1xx_it.c 210行
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
/* USER CODE BEGIN USART1_IRQn 1 */
USER_UART_IRQHandler();
/* USER CODE END USART1_IRQn 1 */
}
改:main.h 57行
/* USER CODE BEGIN EFP */
void USER_UART_IRQHandler();
/* USER CODE END EFP */
加头文件
#include <stdio.h>
/* USER CODE BEGIN PV */
#include "string.h"
const char stringMode1[8] = "mode_1#";
const char stringMode2[8] = "mode_2#";
const char stringStop[8] = "stop#";
int8_t ledMode = -1;
uint16_t LED_value = 0;
uint8_t uart1RxState = 0;
uint8_t uart1RxCounter = 0;
uint8_t uart1RxBuff[128] = {0};
/* USER CODE END PV */
int fputc(int ch,FILE *f) //用printf定义
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
return ch;
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //初始化时开启USART1的RXNE中断
printf("hello world.\r\n");
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
/*如果串口1已接受完毕*/
if(uart1RxState == 1)
{
/*收到了模式一指令*/
if(strstr((const char *)uart1RxBuff, stringMode1) !=NULL)
{
printf("I'm in mode_1!\r\n");
ledMode = 1;
LED_value = 0x80;
}
/*收到了模式二指令*/
else if(strstr((const char *)uart1RxBuff, stringMode2) !=NULL)
{
printf("I'm in mode_2!\r\n");
ledMode = 2;
LED_value = 0x01;
}
/*收到了停止指令*/
else if(strstr((const char *)uart1RxBuff,stringStop) != NULL)
{
printf("I'm stop!\r\n");
ledMode = 0;
LED_value = 0;
}
/*串口相关参数恢复*/
uart1RxState = 0;
uart1RxCounter = 0;
memset(uart1RxBuff,0,128);
}
HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,LED_value,GPIO_PIN_RESET);
HAL_Delay(1000);
switch(ledMode)
{
case 1:
LED_value = LED_value>>1;
if(LED_value == 0)
LED_value = 0X80;
break;
case 2:
LED_value = LED_value<<1;
if(LED_value == 0X100)
LED_value = 0X01;
break;
case 0:
LED_value = 0;
break;
}
/* USER CODE END WHILE */
void USER_UART_IRQHandler() //调用修改的函数
{
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET) //判断是否收到数据
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //开空闲中断
uart1RxBuff[uart1RxCounter]=(uint8_t)(huart1.Instance->DR & (uint8_t)0x00ff);
uart1RxCounter++;
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE); //清0
}
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET)) //判断是否收完
{
__HAL_UART_DISABLE_IT(&huart1,UART_IT_IDLE); //关空闲中断
uart1RxState = 1;
}
}
五、ADC
加头文件
#include <stdio.h>
/* USER CODE BEGIN PV */
uint16_t adc_value = 0;
float voltage = 0.0;
char voltString[50] = {0};
/* USER CODE END PV */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1); //开启
HAL_ADC_PollForConversion(&hadc1,100); //等待结束
adc_value = HAL_ADC_GetValue(&hadc1); //获取值
voltage = (float)adc_value /4096*3.3; //转换为电压值
sprintf(voltString,"采集到的电压值为:%.2f V",voltage);//第二种转换为字符串输出
printf("%s\r\n",voltString);//第二种
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);
return ch;
}
/* USER CODE END 4 */