stm32学习笔记—直接操作gpio进行地址初始化以及串口接受发送数据
直接操作地址进行GPIO初始化
#include "led_driver.h"
#define GPIOC_CRL (*(volatile unsigned int *)0x40011000)
#define GPIOC_CRH (*(volatile unsigned int *)(0x40011000 + 0x04))
#define GPIOC_BSRR (*(volatile unsigned int *)(0x40011000 + 0x10))
#define GPIOC_BRR (*(volatile unsigned int *)(0x40011000 + 0x14))
//1.硬件初始化
void led_init(void)
{
#if 0
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; //引脚
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //响应速度
GPIO_Init(GPIOC, &GPIO_InitStruct);
//关灯(初始状态):设置为高电平
GPIO_SetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8); //设置为高电平
//void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //设置为低电平
#else
//使能时钟总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//PC6\PC7
//GPIOC->CRL &= ~(0xff << 24); //清零
//GPIOC->CRL |= 0x33 << 24; //设置为50MHz 推挽输出
GPIOC_CRL &= ~(0xff << 24); //清零
GPIOC_CRL |= 0x33 << 24; //设置为50MHz 推挽输出
//PC8
// GPIOC->CRH &= ~0xf; //清零
// GPIOC->CRH |= 0x03; //设置为50MHz 推挽输出
GPIOC_CRH &= ~0xf; //清零
GPIOC_CRH |= 0x03; //设置为50MHz 推挽输出
//关灯(初始状态):设置为高电平
GPIOC->BSRR |= 0x07 << 6;
#endif
}
//2.操作硬件
void led_control(LED_TYPE led_type,LED_STATUS led_status)
{
switch(led_type)
{
case LED_RED: //红灯
if(led_status == LED_ON) //灯亮
{
//GPIO_ResetBits(GPIOC, GPIO_Pin_8);
//GPIOC->BSRR |= 0x01 << 24;
//GPIOC->BRR |= 0x01 << 8;
//GPIOC_BSRR |= 0x01 << 24;
GPIOC_BRR |= 0x01 << 8;
}
else //灯灭
{
GPIO_SetBits(GPIOC, GPIO_Pin_8);
}
break;
case LED_GREEN: //绿灯
if(led_status == LED_ON) //灯亮
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7);
}
else //灯灭
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
}
break;
case LED_BLUE: //蓝灯
if(led_status == LED_ON) //灯亮
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
}
else //灯灭
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
}
break;
case LED_ALL: //白灯(所有灯)
if(led_status == LED_ON) //灯亮
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
}
else //灯灭
{
GPIO_SetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);
}
break;
}
}
串口通信(发送接受数据)
AFIO时钟只有两种情况要开:1,设置中断;2,重映射。
#include "uart1_driver.h"
//1.硬件初始化
void uart1_init(void)
{
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
//a.初始化GPIO:PA10 PA9
//Tx:PA9:复用推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//Rx:PA10:浮空输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//b.初始化UART1
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);
//使能UART1
USART_Cmd(USART1, ENABLE);
}
//2.收发数据
//发送一个字符
void uart1_putc(unsigned char ch)
{
#if 0
USART1->DR = ch;
while(!(USART1->SR & (0x01 << 6))); //等待发送完成
#else
USART_SendData(USART1, ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //等待发送完成
#endif
}
//接收一个字符
unsigned char uart1_getc(void) //只适用于8bit位数据
{
#if 0
while(!(USART1->SR & (0x01 << 5))); //等待接收数据
return USART1->DR;
#else
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != SET); //等待接收数据
return USART_ReceiveData(USART1);
#endif
}
//发送字符串
void uart1_sendstring(unsigned char buf[],int length)
{
int i;
for(i = 0; i < length; i++)
uart1_putc(buf[i]);
}
//接收字符串
void uart1_recievstring(unsigned char buf[],int length)
{
int i;
for(i = 0; i < length; i++)
buf[i] = uart1_getc();
}
#include "stm32f10x.h"
#include "led_driver.h"
#include "rcc_driver.h"
#include "systick_driver.h"
#include "uart1_driver.h"
void flow_lamp(void)
{
//红灯亮
led_control(LED_ALL,LED_OFF);
led_control(LED_RED,LED_ON);
delay_ms(1000);
//绿灯亮
led_control(LED_ALL,LED_OFF);
led_control(LED_GREEN,LED_ON);
delay_ms(1000);
//蓝灯亮
led_control(LED_ALL,LED_OFF);
led_control(LED_BLUE,LED_ON);
delay_ms(1000);
}
unsigned char buf[] = "hello";
int main(void)
{
rcc_init();
systick_init();
led_init();
uart1_init(); //Uart1初始化
uart1_putc('a');
uart1_sendstring(buf,5);
while (1)
{
uart1_putc(uart1_getc()); //打印接收到串口助手的数据到串口助手
}
}
版权声明:本文为weixin_42471952原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。