STM32学习第二天---初步了解了一些方便的位运算

                第二天学习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;
}

然后就是观察它的波形了,根据时钟发送的数据看看是否都正确



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值