全能編程開發工程師手把手教你玩轉STM32F103C8T6單片機

一、STM32F103C8T6單片機介紹

STM32F103C8T6是STMicroelectronics公司推出的ARM Cortex-M3系列的32位微控制器,具有高性能、低功耗、低成本等特點。該單片機核心採用Cortex-M3內核,主頻為72MHz,具有64KB的Flash存儲器、20KB的SRAM存儲器,並提供多種通信介面、多個定時器、多個中斷、以及豐富的模擬/數字轉換功能。

二、STM32F103C8T6硬體編程

1. GPIO

GPIO是通用輸入輸出埠,可以設置為輸入或輸出埠,用於控制外置設備的狀態。例如,我們可以通過GPIO輸出高電平,點亮LED燈。

/* GPIO配置 */
GPIO_InitTypeDef GPIO_InitStructure;          //GPIO結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能GPIOA的時鐘

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;          //設置引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //設置模式為推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //設置輸出速度
GPIO_Init(GPIOA, &GPIO_InitStructure);             //初始化GPIOA

2. 中斷

中斷是一種非同步事件,可以在單片機執行其他任務時被觸發,用於處理外部事件。例如,我們可以通過外部中斷來處理某些按鍵的輸入。

/* 外部中斷配置 */
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* 使能AFIO以及GPIOB時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);

/* 配置GPIOB.11為輸入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* 關閉JTAG調試埠,開啟SWD調試介面 */
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

/* 指定外部中斷1對應的GPIOB.11引腳 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);

/* 配置外部中斷1,上升沿觸發 */
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* 配置中斷優先順序 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

三、STM32F103C8T6軟體編程

1. ADC

ADC是模擬/數字轉換器,可以將模擬信號轉換成數字信號。例如,我們可以通過ADC讀取電壓感測器的輸出,並將其轉換為數字信號進行處理。

/* ADC配置 */
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能ADC1時鐘,以及所用引腳的GPIO時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

/* 配置ADC輸入引腳PA0 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 配置ADC1 */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                         //單獨模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;                               //非掃描模式,一次轉換一個通道
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                         //非連續轉換模式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                       //數據右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1;                                     //採樣通道數
ADC_Init(ADC1, &ADC_InitStructure);

/* 配置ADC1的採樣通道0 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);

/* 開啟ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* 啟動ADC1軟體轉換 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2. PWM

PWM是脈寬調製信號,可以調節信號高電平與低電平的時間比例,用於控制電機等設備的轉速。例如,我們可以通過PWM控制舵機的角度。

/* TIM3 PWM配置 */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
uint16_t PrescalerValue = 0;

/* 使能TIM3和GPIOB時鐘 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/* TIM3的預分頻值為71,定時器時鐘為1MHz */
PrescalerValue = (uint16_t) (SystemCoreClock / 1000000) - 1;

/* TIM3基本配置 */
TIM_TimeBaseStructure.TIM_Period = 1999;                   //設置周期值,為2000時,頻率為500Hz
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;       //設置預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;                //設置時鐘分割:不分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

/* PWM通道2的GPIOB.5引腳配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* TIM3 PWM輸出通道2的配置 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;              //輸出使能
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                          //PWM2模式
TIM_OCInitStructure.TIM_Pulse = 1000;                                      //設置占空比,範圍為0-1999
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                   //設置PWM輸出極性為高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);

/* 啟動計時器 */
TIM_Cmd(TIM3, ENABLE);

四、STM32F103C8T6調試技巧

1. 使用USART輸出調試信息

USART是USART串列通信介面,可以將單片機的調試信息輸出到PC上,方便調試。

/* USART1配置 */
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能USART1和GPIOA時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* 將GPIOA的第9位設置為USART1_TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 將GPIOA的第10位設置為USART1_RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1基本配置 */
USART_InitStructure.USART_BaudRate = 9600;                               //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;               //數據長度為8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;                    //停止位為1個
USART_InitStructure.USART_Parity = USART_Parity_No;                       //校驗位無
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //無硬體流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;            //發送和接收

/* 初始化USART1 */
USART_Init(USART1, &USART_InitStructure);

/* 啟動USART1 */
USART_Cmd(USART1, ENABLE);

2. 使用ST-Link進行在線調試

ST-Link是一種在線調試工具,可以實現單步調試、內存查看、斷點設置等功能。

/* ST-Link配置 */
/* 使用Keil uVision5自帶的ST-Link調試器進行在線調試 */

五、總結

本文從STM32F103C8T6單片機的介紹、硬體編程、軟體編程、調試技巧等多個方面進行了詳細的闡述。通過閱讀本文,讀者可以了解到STM32F103C8T6單片機的基本特點、使用方法,以及如何使用不同的編程方法對單片機進行控制和調試。希望本文對讀者有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/199052.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 19:13
下一篇 2024-12-04 19:13

相關推薦

發表回復

登錄後才能評論