OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16454|回复: 13

STM32寄存器操作的学习开始了。再晒几个程序

[复制链接]

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-10-19 09:49:22 | 显示全部楼层 |阅读模式

一直都在用库来写程序,写起来也比较方便也好学。很多东西很快就上手了,不过近来才发现项目要求操作的速度很快,老板又不想买更快更贵的芯片,没有办法,看看用操作寄存器的方法是否跑得快些。加油!!先晒两个copy的程序吧。
IO口输出:
include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"

#define  LED0 PAout(8)
#define  LED1 PDout(2)

void  Led_Init(void);

int  main(void)
{
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 Led_Init();
 while(1)
 {
  LED0 = 0;
  LED1 = 0;
  delay_ms(100);
  LED0 = 1;
  LED1 = 1;
  delay_ms(100);
 }
}

void  Led_Init(void)
{
 RCC->APB2ENR|= 1<<2;
 RCC->APB2ENR|= 1<<5;

 GPIOA->CRH&=0XFFFFFFF0;
 GPIOA->CRH|=0X00000003;
 GPIOA->ODR|=1<<8;

 GPIOD->CRL&=0XFFFFF0FF;
 GPIOD->CRL|=0X00000300;
 GPIOD->ODR|=1<<2;
}


按键程序
#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"

#define  LED0 PAout(8)
#define  LED1 PDout(2)
#define  Key1 PAin(15)

void  Led_Init(void);
void  Key_Init(void);
int  main(void)
{
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 Led_Init();
 Key_Init();
 while(1)
 {
  if(Key1 == 0)
  {
   delay_ms(10);
   if(Key1 == 0)
   {
    LED0 = 0;
    LED1 = 0;
    delay_ms(100);
    LED0 = 1;
    LED1 = 1;
    delay_ms(100);
    }
   }
 }
}

void  Led_Init(void)
{
 RCC->APB2ENR|= 1<<2;
 RCC->APB2ENR|= 1<<5;

 GPIOA->CRH&=0XFFFFFFF0;
 GPIOA->CRH|=0X00000003;
 GPIOA->ODR|=1<<8;

 GPIOD->CRL&=0XFFFFF0FF;
 GPIOD->CRL|=0X00000300;
 GPIOD->ODR|=1<<2;
}

void  Key_Init(void)
{
  RCC->APB2ENR|=1<<2;

  GPIOA->CRH&=0X0FFFFFFF;
  GPIOA->CRH|=0X80000000;
  GPIOA->ODR|=1<<15;
}


串口发送程序:
#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"

u8 *a="suqingxiao!" ;
void  Led_Init(void);
void  Key_Init(void);
void  USART_Initaize(u32 pclk2,u32 bound);
void  Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);

int  main(void)
{
 Stm32_Clock_Init(9);
 delay_init(72);
 USART_Initaize(72,9600);
 while(1)
 {
  Uart1_PutChar('0');
  Uart1_PutString(a,11);
  delay_ms(100); 
 }

}

void  USART_Initaize(u32 pclk2,u32 bound)
{
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 GPIOA->CRH&=0XFFFFF00F;
 GPIOA->CRH|=0X000008B0;//IO状态设置
   
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位       
 //波特率设置
  USART1->BRR=mantissa; // 波特率设置 
 USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX    //如果使能了接收
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
void  Uart1_PutChar(u8 ch)

 USART1->DR = (u8) ch; 
 while((USART1->SR&0X40)==0);//循环发送,直到发送完毕    
}

void Uart1_PutString(u8 *Buf, u8 Len)
{
 u8 i;
 for(i= 0; i<Len; i++)
 {
  Uart1_PutChar(*Buf++);
 }
}

 

 

 

 


 

 


 

直接操作寄存器TXT程序.rar

2.02 KB, 下载次数: 1420

?成功只是最后一小步的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-10-19 12:34:30 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
STM32io口最快的翻转速度貌似在7M还是8M左右吧.之前论坛有人测试过.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-10-19 12:38:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不是能配置去到50多的吗?
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-10-19 12:43:13 | 显示全部楼层
回复【3楼】Tardis:
--------------------------------
我说的反转是利用ODR之类的寄存器来直接 控制的.
 50M应该是指MCO,或者PWM之类的.
而且我测试MCO输出,貌似也到不了50M... 40多一点的样子.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2011-10-19 14:01:43 | 显示全部楼层
学习了,还在学习中,现在还不够深入。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

19

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-7-9
在线时间
0 小时
发表于 2013-7-10 20:59:04 | 显示全部楼层
不用建立LED_init的头文件, 我喜欢这样的编程!今天上午我还在为不会写头文件发愁。没想到可以这样写!豁然开朗了!
回复 支持 反对

使用道具 举报

7

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-5-5 19:24:30 | 显示全部楼层
谢谢楼主  风格直观
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-9-26
在线时间
0 小时
发表于 2014-5-12 14:43:49 | 显示全部楼层
回复【3楼】Tardis:
---------------------------------
头像很暴力很血腥!嘻嘻!
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2014-5-26 18:59:03 | 显示全部楼层
回复【8楼】墨轩2013:
---------------------------------
确实
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-11
在线时间
11 小时
发表于 2016-11-15 22:50:16 | 显示全部楼层
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
请问为什么是这样?
GPIOD->CRL&=?
GPIOD->CRL|=?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-9-6
在线时间
0 小时
发表于 2016-11-16 00:49:55 | 显示全部楼层
学习学习,谢谢楼主
回复 支持 反对

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2016-11-16 08:41:25 | 显示全部楼层
黄靖淞 发表于 2016-11-15 22:50
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
请问为什么是这样?

先用与清零,再用或设置,这样不影响其它位。当然也可以直接写GPIOA->ODR=0x22222222。
回复 支持 反对

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-11
在线时间
11 小时
发表于 2016-11-16 21:08:43 | 显示全部楼层
f1174562 发表于 2016-11-16 08:41
先用与清零,再用或设置,这样不影响其它位。当然也可以直接写GPIOA->ODR=0x22222222。

  GPIOA->CRH&=0XFFFFF00F;//IO状态设置
   GPIOA->CRH|=0X000008B0;//IO状态设置     
   GPIOB->CRL&=0X00FFFFFF;//IO状态设置
   GPIOB->CRL|=0X8B000000;//IO状态设置
那GPIOD-CRL怎么设置?
回复 支持 反对

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2016-11-17 08:22:59 | 显示全部楼层
黄靖淞 发表于 2016-11-16 21:08
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
   GPIOA->CRH|=0X000008B0;//IO状态设置     
   GPIOB->CRL& ...

看看手册照着写就行了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 05:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表