STM32 標準化定義

1. GPIO

 以LED燈爲例

1.1 led.h

#define LED_NUM (3)	// LED的數量

typedef enum 
{
	LED_GREEN = 0,
	LED_RED,
	LED_BLUE2,
} tLed;				// LED的枚舉

// RED
#define LED1_GPIO_PIN	GPIO_Pin_5
#define LED1_GPIO_PORT	GPIOC
#define LED1_GPIO_CLK	RCC_AHB1Periph_GPIOC

// GREEN
#define LED2_GPIO_PIN	GPIO_Pin_4
#define LED2_GPIO_PORT	GPIOC
#define LED2_GPIO_CLK	RCC_AHB1Periph_GPIOC  

// BLUE
#define LED3_GPIO_CLK	GPIO_Pin_6
#define LED3_GPIO_PORT	GPIOB
#define LED3_GPIO_CLK	RCC_AHB1Periph_GPIOB  

#define LED_ON			(1)
#define LED_OFF			(0)

1.2 led.c

// LED端口號結構體,注意結構體的類型
GPIO_TypeDef* LED_PORT[LED_NUM] = { 
	LED1_GPIO_PORT,
	LED2_GPIO_PORT,
	LED3_GPIO_PORT,
}const uint16_t LED_PIN[LED_NUM] = {
	LED1_GPIO_PIN,
	LED2_GPIO_PIN,
	LED3_GPIO_PIN,
};

const uint32_t LED_CLK[LED_NUM] = {
	LED1_GPIO_CLK,
	LED2_GPIO_CLK,
	LED3_GPIO_CLK,
};

void led_init(tLed led);

void led_on(tLed led)
{
	GPIO_WriteBit( LED_PORT[led], LED_PIN[led], LED_ON );
}

void led_off(tLed led);

void led_toggle(tLed led);	// LED翻轉

void led_flash(tLed led, uint32_t ms, uint8_t count);	// LED閃爍,參數2閃爍間隔ms,參數3閃爍次數

2. UART

2.1 uart.h

#define UART_INTERFACE			UART1
#define UART_CLK				RCC_APB2Periph_UART1

#define UART_RX_PORT			GPIOA
#define UART_RX_PORT_CLK		RCC_APB2Periph_GPIOA
#define UART_RX_PIN				GPIO_Pin_5

#define UART_TX_PORT			GPIOB
#define UART_TX_PORT_CLK		RCC_APB2Periph_GPIOA
#define UART_TX_PIN				GPIO_Pin_6

#define  UART_IRQ               USART1_IRQn
#define  UART_IRQHandler        USART1_IRQHandler

2.2 uart.c

void uart_init(void);

/*****************  發送一個字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 發送一個字節數據到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待發送數據寄存器爲空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/*****************  發送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待發送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}

/*****************  發送一個16位數 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
	uint8_t temp_h, temp_l;
	
	/* 取出高八位 */
	temp_h = (ch&0XFF00)>>8;
	/* 取出低八位 */
	temp_l = ch&0XFF;
	
	/* 發送高八位 */
	USART_SendData(pUSARTx,temp_h);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
	/* 發送低八位 */
	USART_SendData(pUSARTx,temp_l);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

///重定向c庫函數printf到串口,重定向後可使用printf函數
int fputc(int ch, FILE *f)
{
		/* 發送一個字節數據到串口 */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/* 等待發送完畢 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///重定向c庫函數scanf到串口,重寫向後可使用scanf、getchar等函數
int fgetc(FILE *f)
{
		/* 等待串口輸入數據 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USARTx);
}

3. I2C

3.1 i2c.h

#define I2C_INTERFACE			I2C1
#define I2C_CLK					RCC_APB2Periph_I2C1

#define I2C_SCL_PORT			GPIOA
#define I2C_SCL_PORT_CLK		RCC_APB2Periph_GPIOA
#define I2C_SCL_PIN				GPIO_Pin_5

#define I2C_SDA_PORT			GPIOB
#define I2C_SDA_PORT_CLK		RCC_APB2Periph_GPIOA
#define I2C_SDA_PIN				GPIO_Pin_6

3.2 i2c.c

void i2c_init(void);
void i2c_master_write(uint8_t addr, uint8_t *buf, uint8_t len);	// 從機地址、數據緩存區、數據長度
void i2c_master_read(uint8_t addr, uint8_t *buf, uint8_t len);	// 從機地址、數據緩存區、數據長度	

4. SPI

4.1 spi.h

#define SPI_INTERFACE			SPI1
#define SPI_CLK					RCC_APB2Periph_SPI1

#define SPI_SCL_PORT			GPIOA
#define SPI_SCL_PORT_CLK		RCC_APB2Periph_GPIOA
#define SPI_SCL_PIN				GPIO_Pin_5

#define SPI_MISO_PORT			GPIOB
#define SPI_MISO_PORT_CLK		RCC_APB2Periph_GPIOA
#define SPI_MISO_PIN			GPIO_Pin_6

#define SPI_MOSI_PORT			GPIOA
#define SPI_MOSI_PORT_CLK		RCC_APB2Periph_GPIOA
#define SPI_MOSI_PIN			GPIO_Pin_7

#define SPI_NSS_PORT			GPIOA
#define SPI_NSS_PORT_CLK		RCC_APB2Periph_GPIOA
#define SPI_NSS_PIN				GPIO_Pin_8

#define SPI_NSS_HIGH			1
#define SPI_NSS_LOW				0

#define SPI_NSS_ENABLE			GPIO_WriteBit( SPI_NSS_PORT, SPI_NSS_PIN, SPI_NSS_LOW);
#define SPI_NSS_DISABLE			GPIO_WriteBit( SPI_NSS_PORT, SPI_NSS_PIN, SPI_NSS_HIGH);

4.2 spi.c

void spi_init(void);
uint8_t SpiInOut(uint8_t outData);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章