STM32 学习笔记

更新时间:2023-09-26 14:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

//////////////GPIO3/////////////////// #include \

#include \#include \

int main(void) {

//1、使能时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

//定义一个IO

GPIO_InitTypeDef PORT_LED;

//设置IO引脚,模式,输出类型,速度

PORT_LED.GPIO_Pin=GPIO_Pin_4;//IO引脚,第4脚(个人的小板子PA4有连接LED) PORT_LED.GPIO_Mode=GPIO_Mode_OUT;//模式:输出

PORT_LED.GPIO_OType=GPIO_OType_PP;//输出类型,推挽输出 PORT_LED.GPIO_Speed=GPIO_Speed_10MHz;//输出速率,10MHz GPIO_Init(GPIOA,&PORT_LED);//正式初始化,PA口

GPIO_SetBits(GPIOA,GPIO_Pin_4);//输出高电平 //GPIO_ResetBits(GPIOA,GPIO_Pin_4);//输出低电平

while(1) {} }

///////////////USART//////////////////// #include \

#include \#include \#include \

int main(void) {

//1、使能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//特别注意:因为串口有使用GPIO,所以对应GPIO的时钟也要使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //2、选择引脚

//TX有PA2和PA9可选,RX有PA3和PA10可选

//GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1); //GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//为什么是AF1,而不是AF0呢?见下图,数据手册才是准确的

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);

//3、引脚设置

GPIO_InitTypeDef PORT_UART1_TX;//定义TX脚,PORT_UART1_TX是自定义名称,可以任意

PORT_UART1_TX.GPIO_Pin=GPIO_Pin_9;//此参数根据上面选择的引脚来定 PORT_UART1_TX.GPIO_Speed=GPIO_Speed_10MHz; PORT_UART1_TX.GPIO_Mode=GPIO_Mode_AF; PORT_UART1_TX.GPIO_PuPd=GPIO_PuPd_NOPULL; //IO初始化

//第一个参数是系统的GPIOA、GPIOB、GPIOC等

//第二个参数是&+上面自定义的名称PORT_UART1_TX GPIO_Init(GPIOA,&PORT_UART1_TX);

GPIO_InitTypeDef PORT_UART1_RX;//定义RX脚

PORT_UART1_RX.GPIO_Pin=GPIO_Pin_10;//此参数根据上面选择的引脚来定 PORT_UART1_RX.GPIO_Speed=GPIO_Speed_10MHz; PORT_UART1_RX.GPIO_Mode=GPIO_Mode_AF; PORT_UART1_RX.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&PORT_UART1_RX);

//4、串口参数配置

USART_InitTypeDef MyUsart1;//这个MyUsart1是我自定义的,可以任意定义如XYZ123 MyUsart1.USART_BaudRate=115200;//设置波特率

MyUsart1.USART_WordLength=USART_WordLength_8b;//设置数据长度 MyUsart1.USART_Parity=USART_Parity_No;//设置奇偶校验 MyUsart1.USART_StopBits=USART_StopBits_1;//设置停止位

MyUsart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置流控制

MyUsart1.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//设置模式 //初始化

//第一个参数是系统的USART1、USART2、USART3等 //第二个参数就是&+上面自定义的量MyUsart1 USART_Init(USART1,&MyUsart1);

//5、使能

USART_Cmd(USART1,ENABLE);

//6、接收和发送,通过查询标志位 while(1){

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=1);//等待接收 USART_ClearFlag(USART1,USART_FLAG_RXNE);//清楚接收完成标志位

USART_SendData(USART1,USART_ReceiveData(USART1));//接收什么,发送什么 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=1);//等待发送完成 USART_ClearFlag(USART1,USART_FLAG_TXE);//清楚发送完成标志位

} }

//////////////////USART之中断////////////////// #include \

#include \#include \#include \#include \

#include \

int main(void) {

//1、使能时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//2、引脚选择

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);

//3、引脚设置

GPIO_InitTypeDef PORT_UART1_TX;//定义TX脚,PORT_UART1_TX是自定义名称,可以任意

PORT_UART1_TX.GPIO_Mode=GPIO_Mode_AF;

PORT_UART1_TX.GPIO_Pin=GPIO_Pin_9;//此参数根据上面选择的引脚来定 //PORT_UART1_TX.GPIO_Speed=GPIO_Speed_10MHz; PORT_UART1_TX.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOA,&PORT_UART1_TX);

GPIO_InitTypeDef PORT_UART1_RX;//定义RX脚 PORT_UART1_RX.GPIO_Mode=GPIO_Mode_AF;

PORT_UART1_RX.GPIO_Pin=GPIO_Pin_10;//此参数根据上面选择的引脚来定 //PORT_UART1_RX.GPIO_Speed=GPIO_Speed_10MHz; PORT_UART1_RX.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOA,&PORT_UART1_RX);

//4、串口参数配置

USART_InitTypeDef MyUsart1;//这个MyUsart1是我自定义的,可以任意定义如XYZ123 MyUsart1.USART_BaudRate=9600;//设置波特率

MyUsart1.USART_WordLength=USART_WordLength_8b;//设置数据长度 MyUsart1.USART_Parity=USART_Parity_No;//设置奇偶校验 MyUsart1.USART_StopBits=USART_StopBits_1;//设置停止位

MyUsart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置流控制 MyUsart1.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//设置模式 USART_Init(USART1,&MyUsart1);

//允许接收中断RXNE和发送完成中断TC

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_ITConfig(USART1,USART_IT_TC,ENABLE);

//5、使能

USART_Cmd(USART1,ENABLE);

//6、中断向量设置

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//设置中断 NVIC_InitStructure.NVIC_IRQChannelPriority=0;//设置优先级 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能 NVIC_Init(&NVIC_InitStructure);

while(1){

} }

//中断函数

void USART1_IRQHandler(void){ unsigned char temp=0; //如果是接收中断

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){

temp=USART_ReceiveData(USART1);//读完即自动清除RXNE USART_SendData(USART1,temp);

//USART_ClearFlag(USART1,USART_FLAG_RXNE); }

//如果是发送中断 else {

USART_ClearFlag(USART1,USART_FLAG_TC); //...... } }

////////////////系统定时器///////////////////// #include \#include \

int main(void){

//配置初值,系统定时器是倒数计时器,减1的

//注意:该函数的参数类型虽为uinit32_t,实际最大值为16777215,也就是2^24 SysTick_Config(SystemCoreClock/10); while(1); }

//中断函数

void SysTick_Handler(void){

//这里做你想做的事情 }

/////////////////外部中断//////////////// #include \#include \#include \#include \#include \

int main(void) {

//时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//外部按键GPIO初始华,PA0

GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);

//将EXTI0指向PA0

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //EXTI0中断线配置

EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure);

//EXTI0中断向量配置

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel=EXTI0_1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);

while(1){

} }

void EXTI0_1_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line0)!=RESET) {

//中断处理 }

//退出中断时注意清除标志位 EXTI_ClearFlag(EXTI_Line0); }

///////////ADC///////////////////

#include \#include \#include \

int main(void) {

//时钟配置

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

//ADC IO配置,此处定义PA0口为ADC端口 GPIO_InitTypeDef PORT_ADC; PORT_ADC.GPIO_Pin=GPIO_Pin_0;

PORT_ADC.GPIO_Mode=GPIO_Mode_AN; PORT_ADC.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&PORT_ADC);

//ADC 参数配置

ADC_InitTypeDef ADC_InitStuctrue;

ADC_InitStuctrue.ADC_Resolution=ADC_Resolution_12b;//12位精度 ADC_InitStuctrue.ADC_ContinuousConvMode=DISABLE;//单次ADC

ADC_InitStuctrue.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐

ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward;//数据覆盖

ADC_Init(ADC1,&ADC_InitStuctrue);

//配置ADC采样的通道和采样周期 //PA0对应ADC通道0

//注意,采集的数据是否准确与采样时间有关系

ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_239_5Cycles); //如果采集系统内部温度,则通道为16,同时要使能温度传感器

//ADC_ChannelConfig(ADC1,ADC_Channel_16,ADC_SampleTime_239_5Cycles); //ADC_TempSensorCmd(ENABLE);

//校准

ADC_GetCalibrationFactor(ADC1); //使能

ADC_Cmd(ADC1,ENABLE);

//等待ADC准备

while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN)==RESET); //软件启动ADC转换

ADC_StartOfConversion(ADC1); //等待ADC完成

while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //所得数据即为ADC数据

unsigned short adc_data=ADC_GetConversionValue(ADC1); /*

//如果采集的是16通道,即芯片温度,则温度的值如下

//下面这段代价,参考STM32F030数据手册(寄存器版)A.7.16 //出厂校准数据所存储的地址,30°C和110°C的ADC值

#define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2)) #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8)) #define VDD_CALIB ((uint16_t) (330)) #define VDD_APPLI ((uint16_t) (300)) int32_t temperature;

temperature = (((int32_t) ADC1->DR * VDD_APPLI / VDD_CALIB)- (int32_t) *TEMP30_CAL_ADDR );

temperature = temperature * (int32_t)(110 - 30);

temperature = temperature / (int32_t)(*TEMP110_CAL_ADDR- *TEMP30_CAL_ADDR); temperature = temperature + 30; */

while(1) { } }

本文来源:https://www.bwwdw.com/article/oxqd.html

Top