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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>