目录
1.配置时钟系统:
3.LCD屏幕
4.Uart串口配置
5.I2c编写
6.ADC的配置
7.Tim文件
2)PA15(Tim2-Ch1) [R40] 作为输入捕获模式
3)PA6(Tim3_ch1)、PA7(Tim17_ch1)的pwm输出 频率一样,占空比可调
4)PA2(Tim15_ch1)输出方波是输出比较模式 同一个定时器,输出不同频率的波
STM32CubeMx
选stm32G431RBT6
-
配置时钟系统:
- RCC: ”Crystal/Ceramic Resonator”
- SYS:SysTick
- Clock Configuration :Input:24 ->HSE->/3 *20 /2 PLLCLK 80MHZ
-
Key和Led配置:
- PA0,PB0,PB1,PB2,配置GPIO_Input;
- PC8-PC15,配置GPIO-Output,mode:High;
- LED PD2配置GPIO-Output
-
LCD屏幕
- 添加lcd.c;lcd.h,font.h文件即可
-
void Lcd_Proc(void) { if((uwTick - uwTick_Lcd)<100) return;//减速函数 uwTick_Lcd = uwTick; //屏幕测试代码 sprintf((char *)Lcd_Str, "TEST CODE"); LCD_DisplayStringLine(Line9, Lcd_Str); }
-
Uart串口配置
- PA9:USART1_TX; PA10:USART1_RX
- USART1->Mode->Asynchonous 波特率:9600
- NVIC:Enable; 其余默认即可。
- 串口接收中断打开:
-
//*串口接收中断打开 HAL_UART_Receive_IT(&huart1, (uint8_t *)(&rx_buffer), 1);
- 编写函数
-
void Usart_Proc(void) { if((uwTick - uwTick_Usart)<1000) return;//1s发一次 uwTick_Usart = uwTick; // sprintf(str, "%04d:Hello,world.\r\n", counter); // HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50); // // if(++counter == 10000) // counter = 0; } //串口接收中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // counter++; sprintf(str, "%04d:Hello,world.\r\n", counter); HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50); // // HAL_UART_Transmit(&huart1,(unsigned char *)(&counter),1, 50); // HAL_UART_Receive_IT(&huart1, (uint8_t *)(&rx_buffer), 1); }
-
I2c编写
- 添加.c和.h文件。
- I2c_hal.c里的unsigned char I2CReceiveByte(void)应该是
- SCL_Output(0);
- delay1(DELAY_TIME);
- SDA_Output_Mode();
- 增加自己的代码:写和读的代码
//24C02的相关代码 void iic_24c02_write(uint8_t *pucBuf, uint8_t ucAddr, uint8_t ucNum) { I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(ucAddr); I2CWaitAck(); while(ucNum--) { I2CSendByte(*pucBuf++); I2CWaitAck(); } I2CStop(); delay1(500); } void iic_24c02_read(uint8_t *pucBuf, uint8_t ucAddr, uint8_t ucNum) { I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(ucAddr); I2CWaitAck(); I2CStart(); I2CSendByte(0xa1); I2CWaitAck(); while(ucNum--) { *pucBuf++ = I2CReceiveByte(); if(ucNum) I2CSendAck(); else I2CSendNotAck(); } I2CStop(); } //MCP4017的相关代码 void write_resistor(uint8_t value) { I2CStart(); I2CSendByte(0x5E); I2CWaitAck(); I2CSendByte(value); I2CWaitAck(); I2CStop(); } uint8_t read_resistor(void) { uint8_t value; I2CStart(); I2CSendByte(0x5F); I2CWaitAck(); value = I2CReceiveByte(); I2CSendNotAck(); I2CStop(); return value; }
-
ADC的配置
- IN11--> Single-ended;
- Clock Prescaler-->Asynchro...
- Rank-->640.5Cycles
- 手敲getADC的代码
-
uint16_t getADC1(void) { uint16_t adc = 0; HAL_ADC_Start(&hadc1); adc = HAL_ADC_GetValue(&hadc1); return adc; } uint16_t getADC2(void) { uint16_t adc = 0; HAL_ADC_Start(&hadc2); adc = HAL_ADC_GetValue(&hadc2); return adc; }
- 电压值:(float)getADC2())/4096)*3.3)
-
Tim文件
-
Tim6、Tim7标准定时器
- Prescaler: 7999(80 0000/8000=10 000)
- Counter Period: 999 (1 000 / 10 000=0.1s一次)
- NVIC中断打开。
-
PA15(Tim2-Ch1) [R40] 作为输入捕获模式
- Tim2_ch1:Reset mode(复位模式); 触发源:TI1FP1;内部时钟:Internal Clock
- 两个通道:direct;indirect
- 分频80;65535;Rising Edge;
- Ch1;Ch2上升沿;下降沿
- 需要NVIC中断的
-
3.PA6(Tim3_ch1)、PA7(Tim17_ch1)的pwm输出 频率一样,占空比可调
在使用pwm模式时,我们只要设置预分频系数PSC,自动重装载值ARR,就能确定PWM的具体频率,即PWM频率=(系统时钟频率)/(ARR+1)*(PSC+1)
- PWM Generation CH1
- PSC : 79;80 000 000/80 =1000 000
- Cubemx配置完成之后只需要启动定时器就可以完成pwm的输出。
- 不用中断
- Pulse:300 ; ->就是30% 600->60%
- ARR : 999; 1000次计数,频率就是1Khz
- Auto_reload:Enable
- Cubemx配置完成之后只需要启动定时器就可以完成pwm的输出。
- 启动定时器:HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //PA6
4.PA2(Tim15_ch1)输出方波是输出比较模式 同一个定时器,输出不同频率的波
- Internal clock
- Ch1 输出比较模式
- 79; 65535;
- Auto_reload :关闭
- Mode :Toggle
- Pulse :100
- 需要nvic中断
8.RTC配置
- TIM ->RTC
- Activate Clock Sourse ; Activate Calendar
- Asynchronous 125
- Synchronous 6000 //125/6000=750 000
- BCD码就行