一、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