先把我的工程给出来
工程上传到了我的github上了,点此进入
我用的芯片型号是stm32f103c8t6
配置工程
打开stm32cubemx,选择芯片型号为stm32f103c8t6
此处可能需要科学上网
然后选择芯片型号,我用的是stm32f103c8t6
左上方输入芯片型号,右下方会出现对应的窗口,或者直接在右下方翻也行。
双击右下方窗口
首先配置系统设置,我DEBUG用的是SW接口
然后配置时钟源为外部高速晶振(stm32有内部振荡器可以作为时钟源,但是系统频率达不到72M,在做一些低功耗的开发时可能会用内部时钟源,一般情况用外部的8M高速晶振作为时钟源,另外stm32还可以外界一个32.768K的低速晶振给RTC提供时钟)
然后配置时钟,这里我们直接配置到72M(stm32f103的系统频率最高72M,但是用内部时钟源时貌似不能配到72M,所以前一步要记着配置为外部时钟源)
然后配置IO
GPIO output level 为对应引脚的初始状态,可选择为高电平或低电平
GPIO mode为对应引脚的输出状态,可选择为推挽或者开漏
GPIO Pull-up/Pull-down为对应引脚的内部拉动选择,可选择为上拉下拉或者浮空(输出状态下这个设置是无效的)
Maximum output speed为引脚最大输出速度,可选择为low/medium/high
(I/O口输出模式下有三种输出速度可选(2MHz,10MHz,50MHz),这个速度是指I/O口驱动电路的响应速度;I/O管脚内部有多个响应不同的驱动电路,用户可以根据自己的需要选择合适的驱动电路。
- 对于串口来说,加入最大波特率为115200,这样只需要用2M的GPIO的引脚速度就可以了,省电噪音又小;
- 对于I2C接口,假如使用400 000波特率,若想把余量留大一些,2M的GPIO引脚速度或许是不够,这时可以选用10M的GPIO引脚速度;
- 对于SPI接口,假如使用18M或9M的波特率,用10M的GPIO口也不够用了,需要选择呢50M的GPIO引脚速度 ;
- GPIO口设置为输入时,输出驱动电路与端口是断开的,所以这时配置输出速度是无意义的;)
最终生成代码
注意工程名称不要出现中文
点击GENERATE CODE 就会生成文件了
打开工程文件
注意/* USER CODE BEGIN Init /与/ USER CODE END Init */为代码保护区,写在二者之外的程序会在cube重新生成代码时被擦除
这是我的main函数,实现间隔一秒闪烁
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
HAL_Delay为Hal库里定义的一个弱函数,
__weak void HAL_Delay(uint32_t Delay),参数单位为ms,是利用系统滴答定时器的较为精确的延时,但注意延时过程中系统处于非阻塞状态下,且默认系统定时器中断优先级最高。
Hal库里定义的GPIO操作主要有:
HAL_GPIO_ReadPin;读取某一特定引脚的电平;
HAL_GPIO_WritePin;将某特定引脚电平输出设置为高/低;
HAL_GPIO_TogglePin;翻转某一特定引脚的输出。