STM32學習第二天---初步瞭解了一些方便的位運算

版權聲明:本文爲博主原創文章,轉載註明出處。 https://blog.csdn.net/Adrian_1/article/details/50043921

                第二天學習stm32了,也是像往常一樣8點鐘到了實驗室,學習的前20天應該是有60講的視頻要看的,所以興高采烈的打開學習視頻準備看,這時老師的到來打破了我寧靜的內心啊,原本爲了沒多長時間就要開賽的藍橋杯,我要從0開始,把stm32學個大概才行,所以我放棄了複習四級(大三了四級還沒過,愁人啊)。全身心投入在這裏。可是老師過來把手中的優盤交給我讓我把相應內容拷到電腦裏。我知道噩夢來臨了,之前說的創新項目就要開始了,我必須要努力學習做項目相關的知識,因爲老師對我的保研寄予厚望,所以才臨時把我調換進來的。所以這個也是需要力爭的。老師出去之後。我這顆心就無法靜下來了。感覺好煩躁。感覺壓力好大。

               今天主要會了一些stm32簡單的位操作方法,利用端口地址加上公式把對應位的函數寫出的。然後就是調用了。(現在還沒有看什麼stm32的庫啊,那個東西雖然方便使用,但是步驟繁瑣,而且感覺不太好記)

               下面是一個發送數據的例子,用的就是位操作方法

              

#include "stm32f10x.h"
#include <stdio.h>

#define PA1 GPIOA->BSRR
#define PA0 GPIOA->BRR

#define GPIOA_ODR_A (GPIOA_BASE + 0x0C) //端口對應寄存器等於端口基址加上對應便宜地址
#define GPIOA_IDR_A (GPIOA_BASE + 0x08)

#define GPIOB_ODR_A (GPIOB_BASE + 0x0C)
#define GPIOB_IDR_A (GPIOB_BASE + 0x08)

#define GPIOC_ODR_A (GPIOC_BASE + 0x0C)
#define GPIOC_IDR_A (GPIOC_BASE + 0x08)

#define GPIOD_ODR_A (GPIOD_BASE + 0x0C)
#define GPIOD_IDR_A (GPIOD_BASE + 0x08)

#define GPIOE_ODR_A (GPIOE_BASE + 0x0C)
#define GPIOE_IDR_A (GPIOE_BASE + 0x08)


#define BitBand(Addr, BitNum) *((volatile unsigned long *)((Addr & 0xF0000000) + 0x2000000 + ((Addr & 0xfffff) << 5) + (BitNum << 2))) //轉位操作 公式

#define PAout(n)  BitBand(GPIOA_ODR_A, n)//對應端口的第n位
#define PAin(n)	  BitBand(GPIOA_IDR_A, n)

#define PBout(n)  BitBand(GPIOB_ODR_A, n)
#define PBin(n)	  BitBand(GPIOB_IDR_A, n)

#define PCout(n)  BitBand(GPIOC_ODR_A, n)
#define PCin(n)	  BitBand(GPIOC_IDR_A, n)

#define PDout(n)  BitBand(GPIOD_ODR_A, n)
#define PDin(n)	  BitBand(GPIOD_IDR_A, n)

#define PEout(n)  BitBand(GPIOE_ODR_A, n)
#define PEin(n)	  BitBand(GPIOE_IDR_A, n)

void Delay_MS(u16 dly)
{
	u16 i, j;
	for (i = 0; i < dly; i++)
		for (j = 1000; j > 0; j--)
			;
}

int main(void)
{
	u8 data, i;
	//PA.0鏈接 AB, PA.1鏈接Clock, PB.0鏈接clear
	//使得164的QA~QB輸出:11000100
	GPIOA->CRL = 0x33;
	GPIOB->CRL = 0x03;
	PBout(0) = 1;	//clear 高電平有效
	data = 0xC4;	//11000100的16進制形式
	for (i = 0; i < 8; i++)
	{
		PAout(1) = 0;
		if (data & 0x01 == 0x01)
			PAout(0) = 1;
		else
			PAout(0) = 0;
		Delay_MS(1);
		PAout(1) = 1;
		Delay_MS(1);

		data = data >> 1;
	}
	//1.設置引腳PA.0,PA.1,PB.0推輓輸出
	
	//2.進行通信
	return 1;
}

然後就是觀察它的波形了,根據時鐘發送的數據看看是否都正確



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