stm32自学笔记共20页
STM32自学笔记

STM32⾃学笔记⼀、原⼦位操作:原⼦位操作定义在⽂件中。
令⼈感到奇怪的是位操作函数是对普通的内存地址进⾏操作的。
原⼦位操作在多数情况下是对⼀个字长的内存访问,因⽽位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。
原⼦操作中的位操作部分函数如下:void set_bit(int nr, void *addr)原⼦设置addr所指的第nr位void clear_bit(int nr, void *addr)原⼦的清空所指对象的第nr位void change_bit(nr, void *addr)原⼦的翻转addr所指的第nr位int test_bit(nr, void *addr)原⼦的返回addr位所指对象nr位inttest_and_set_bit(nr, void *addr)原⼦设置addr所指对象的第nr位,并返回原先的值int test_and_clear_bit(nr, void *addr)原⼦清空addr所指对象的第nr位,并返回原先的值int test_and_change_bit(nr, void *addr)原⼦翻转addr所指对象的第nr位,并返回原先的值unsigned long word = 0;set_bit(0, &word); /*第0位被设置*/set_bit(1, &word); /*第1位被设置*/clear_bit(1, &word); /*第1位被清空*/change_bit(0, &word); /*翻转第0位*/⼆、STM32的GPIO锁定:三、中断挂起:因为某种原因,中断不能马上执⾏,所以“挂起”等待。
⽐如有⾼、低级别的中断同时发⽣,就挂起低级别中断,等⾼级别中断程序执⾏完,在执⾏低级别中断。
四、固⽂件:固件(Firmware)就是写⼊EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。
STM32学习笔记

STM32学习笔记1、GPIO函数:输出:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);//此例以PA12⼝为例HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); //此例以PA12⼝为例HAL_GPIO_ TogglePin(GPIOA,GPIO_PIN_12); //此例以PA12⼝为例2、串⼝函数:1、串⼝发送/接收函数HAL_UART_Transmit();串⼝轮询模式发送,使⽤超时管理机制HAL_UART_Receive();串⼝轮询模式接收,使⽤超时管理机制HAL_UART_Transmit_IT();串⼝中断模式发送HAL_UART_Receive_IT();串⼝中断模式接收HAL_UART_Transmit_DMA();串⼝DMA模式发送HAL_UART_Transmit_DMA();串⼝DMA模式接收2、串⼝中断函数HAL_UART_TxHalfCpltCallback();⼀半数据发送完成时调⽤HAL_UART_TxCpltCallback();数据完全发送完成后调⽤HAL_UART_RxHalfCpltCallback();⼀半数据接收完成时调⽤HAL_UART_RxCpltCallback();数据完全接受完成后调⽤HAL_UART_ErrorCallback();传输出现错误时调⽤例程:串⼝接收中断uint8_t aTxStartMessages[] = "\r\n******UART commucition using IT******\r\nPlease enter 10 characters:\r\n";uint8_t aRxBuffer[20];2、在main函数中添加两个语句通过串⼝中断发送aTxStartMessage数组的数据和接收数据10个字符,保存在数组aRxBuffer中HAL_UART_Transmit_IT(&huart1 ,(uint8_t*)aTxStartMessages,sizeof(aTxStartMessages)); //sizeof()可读取⽬标长度HAL_UART_Receive_IT(&huart1,(uint8_t*)aRxBuffer,10);3、在main.c⽂件后⾯添加中断接收完成函数,将接收到的数据⼜通过串⼝发送回去。
STM32学习笔记

串口:一. USART_ITConfig(USART1, USART_IT_TXE, ENABLE):只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。
二.以下是字符发送的配置过程,注意第6点,在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送,所以即便你执行了USART_ClearFlag(USART1, USART_FLAG_TC); (这个函数肯定在空闲帧数据发送完成前执行),所以当空闲帧发送完后,就进入发送完成中断。
配置步骤:1. 通过在USART_CR1寄存器上置位UE位来激活USART2. 编程USART_CR1的M位来定义字长。
3. 在USART_CR2中编程停止位的位数。
4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMA T)。
按多缓冲器通信中的描述配置DMA寄存器。
5. 利用USART_BRR寄存器选择要求的波特率。
6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。
在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。
当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。
解决的办法:方法一在执行USART_ITConfig(USART1, USART_IT_TC, ENABLE); 之前,先延时一段时间,基本上比一个字符发送的时间长一点就可以了,然后再执行USART_ClearFlag(USART1, USART_FLAG_TC);方法二:在执行USART_ITConfig(USART1, USART_IT_TC, ENABLE); 之前,USART_ClearFlag(USART1, USART_FLAG_TC);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET){; //等待空闲帧发送完成后再清零发送标志}USART_ClearFlag(USART1,USART_FLAG_TC);三.TXE:发送缓冲器空闲标志RXNE:接收缓冲区非空IAP:一.问:这几天在折腾STM32的IAP,参考了两个例程,一个AN2557,然后一个就是标准外设库内的flash例程总结IAP:1.Flash解锁 FLASH_Unlock();2.清除Flash所有的未完成的标志位 FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);3.根据文件大小擦除Flashfor(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE ); EraseCounter++){FLASHStatus = FLASH_ErasePage(StartAddr + (FLASH_PAGE_SIZE * EraseCounter));}4.编程Flashwhile((Address < EndAddr) && (FLASHStatus == FLASH_COMPLETE)){FLASHStatus = FLASH_ProgramWord(Address, Data);Address = Address + 4;}5.检验编入数据的正确性while((Address < EndAddr) && (MemoryProgramStatus != FAILED)){if((*(__IO uint32_t*) Address) != Data){MemoryProgramStatus = FAILED;}Address += 4;}在以上几步中,如果上面没有问题的话,提出下面几个疑问1.假如我的应用程序的地址应该从0x8003000开始,那么我把后面的页全部擦除是否可以? 虽然我的程序可能只占到0x8003000-0x8005000 那么这之后的页是否也可以一并擦除?2.在编程的时候有个很小的问题,因我的数据都是以字节(byte)的形式储存的,在写的时候因为只能以半字(16位)或一个字(32位)的方式编程,那么如果我的bin文件的最后一个字节并不够两个字节,怎么办?举例:我的bin文件的大小是501个字节(8位),我的写入方法是这样的:data[501] = {X,X,X...}//应用程序bin文件内容temp = data[0];temp = temp << 8;temp |= data[1];temp = temp << 8;temp |= data[2];teme = temp << 8;teme |= data[3];//待写入得数据FLASHStatus = FLASH_ProgramWord(Address, temp);//写入flash如果像这样的话,那么不能被4整除的那一个字节怎么办?3.IAP程序中有一处一直很迷惑,不能理解/* Test if user code is programmed starting from address "ApplicationAddress" */if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000){ /* Jump to user application */JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) ApplicationAddress);Jump_To_Application();}程序的整体是要跳出IAP引导区跳到应用程序区.那么这句判断的依据是什么?if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)倘若我今天的程序是重0x8003000处开始,那么明天我升级一个程序,他的开始是0x80080000呢?这里需要改吗?0x2FFE0000 0x20000000 这两个数我在AN2557的例子代码里反复寻找,并没有哪里出现,那么又是怎么跟用户的应用程序关联的呢?还有如果将上面的例子直接这样更改,是否可以达到跳转到应用程序区的目的呢?/* Jump to user application */JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); //这里为何要+4 ?+了4不就跳过出应用程序的入口了吗?Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) ApplicationAddress);Jump_To_Application();4.关于Flash的写保护问题,在3.0标准外设库中Flash还有另外一个例子,就是关于保护的无疑flash的保护是对程序的一个安全保障,但目前我买的新片子(未进行过任何保护方面的操作)中,是否不需要考虑这些问题,直接擦除,然后编程即可?5.有什么理由要“今天的程序是重0x8003000处开始,明天又升级一个程序,他的开始是呢”?第1没有必要,第2是自寻烦恼。
STM32学习笔记

STM32学习一、初识库(略)二、(略)三、(略)四、(略)五、(略)六、系统定时器1、注意外部函数的声明;2、与六相同,也使用了中断;3、Volatile是不让编译优化的意思;4、Extern即定义外部函数,static是静态变量的意思。
七、串口通信1、当使用printf时,记得要在“bsp_usart1.h”文件中把“stdio.h”包含进来2、NVIC是中断优先级配置函数3、注意使用微库右图中的Use Micro LIB要打勾4、八、DMA1、DMA含义:data memory access,直接内存访问,此时不经过CPU2、这种方式节省CPU资源,好像可以同时做两件事(ADC、SPI、I2C等),不同的外设通道不同,可参看数据手册,串口1是通道4九、ADC1、ADC为12位,时钟为14MHz,最小采样时间为1微秒2、要提高采集频率,可采用多通道交叉采样。
十、FSMC液晶显示1、FSMC含义:灵活的静态存储器控制器2、注意配置IO引脚的第二功能时应注意配置成“AF-pp”即复用推挽模式;3、注意片选BANK1-44、野火自带的屏的高度840,宽320十一、I2C总线1、I2C一般都是开漏输出2、一般向I2C写数据时,如不加限制,是从头开始,写到本页结束如果再写又回到本页开头,会覆盖原来内容,因此,为避免这种情况,加地址。
十二、SPI总线1、SPI总线的读写速度(特别是读速度)要比对SD卡的快,而且成本低;2、SPI总线模块可存汉字字库、图片等,一些掉电保护信息也可存于此;3、在“bsp_spi_flash.c”中,语句“RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOD, ENABLE);”中的D端口时钟不需要开,即“RCC_APB2Periph_GPIOD”是不必要的,可以删去;4、“sizeof()”是C语言的保留字,其用法在此有描述。
STM32学习笔记

STM32学习笔记MDK不会让你直接在入口参数处设置一个简单的字,因为这样代码可读性太差MDK一般把取值范围的宏定义放在判断有效性语句的上方,这样是为了方便大家查找可以通过|(或)的方式同时初始化多个IO口。
这样操作的前提是,他们的Mode和Speed参数相同,因为Mode和Speed参数并不能一次定义多种在tm32f10某.h看那些外设是挂载在那个总线之下GPIO操作步骤为:1)使能IO口时钟。
调用函数为RCC_APB2PeriphClockCmd()。
2)初始化IO参数。
调用函数GPIO_Init();3)操作IO。
按键一端接高电平时另一端接I/O口则I/O口设置为下拉输入,因为按键按下时I/O口变成高电平;反之接低电平时I/O口设置为上拉输入因为按键按下时I/O口状态为低电平Config意为配置voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改当接收到从电脑发过来的数据,把接收到的数据保存在USART_R某_BUF中,同时在接收状态寄存器(USART_R某_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由2个字节组成:0某0D和0某0A)的第一个字节0某0D时,计数器将不再增加,等待0某0A的到来,而如果0某0A没有来到,则认为这次接收失败,重新开始下一次接收。
如果顺利接收到0某0A,则标记USART_R某_STA的第15位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0某0D,那么在接收数据超过USART_REC_LEN的时候,则会丢弃前面的数据,重新接收。
USART初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。
①串口时钟使能,GPIO时钟使能②串口复位③GPIO端口模式设置④串口参数初始化⑤初始化NVIC并且开启中断⑥使能串口SyTick是系统滴答计时器在E某TI_GetITStatu函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而E某TI_GetFlagStatu直接用来判断状态标志位。
stm32学习笔记(狼牙整理)

系统时钟 SYSCLK 最大频率为 72MHz,它是供 STM32 中绝大部分部件工作的时钟源。 系统时钟可由 PLL、HSI 或者 HSE 提供输出,并且它通过 AHB 分频器分频后送给各模 块使用,AHB 分频器可选择 1、2、4、8、16、64、128、256、512 分频。其中 AH B 分频器输出的时钟送给 5 大模块使用:①、送给 AHB 总线、内核、内存和 DMA 使用 的 HCLK 时钟。 ②、分频后送给 STM32 芯片的系统定时器时钟(Systick=Sysclk/8=9Mhz) ③、直接送给 Cortex 的自由运行时钟(free running clock)FCLK。【ARMJISHU 注:FCL K 为处理器的自由振荡的处理器时钟,用来采样中断和为调试模块计时。在处理器休眠时, 通过 FCLK 保证可以采样到中断和跟踪休眠事件。 Cortex-M3 内核的“自由运行时钟(fre e running clock)”FCLK。“自由”表现在它不来自系统时钟 HCLK,因此在系统时钟停 止时 FCLK 也继续运行。FCLK 和 HCLK 互相同步。FCLK 是一个自由振荡的 HCLK。FCL K 和 HCLK 应该互相平衡,保证进入 Cortex-M3 时的延迟相同。】④、送给 APB1 分频 器。APB1 分频器可选择 1、2、4、8、16 分频,其输出一路供 APB1 外设使用(PCLK1, 最大频率 36MHz),另一路送给定时器(Timer)2、3、4 倍频器使用。该倍频器可选择 1 或 者 2 倍频,时钟输出供定时器 2、3、4 使用。 ⑤、送给 APB2 分频器。APB2 分频器可选择 1、2、4、8、16 分频, 其输出一路供 APB 2 外设使用(PCLK2,最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。该倍频
STM32一部分学习笔记

1、迷你版stm32共有64个引脚,分为4组ABCD,每组16个引脚
2、关于BSRR、BRR、ODR寄存器的区别于联系(BSRR可以只对一位操作而不影响其他位)
3、IO口时钟使能位设置函数: stm32f10x_rcc.h中第692、693、694行的函数:
RCC_AHBPeriphClockCmd
RCC_APB2PeriphClockCmd
RCC_APB1PeriphClockCmd
4、IO口使能参数定义在stm32f10x_rcc.h中的466行--554行:
5、关于IO口使能设置的方式:①首先查看硬件,找到对应要使用的IO口
②然后找到系统IO口使能参数的定义
③然后确定使能的位设置函数(RCC_AHBP eriphClockCmd,
RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd
中的一个)
④最后在main函数里面设置使能。
MDK:
6、GPIO寄存器描述:《STM32中文参考手册_V10》第八章。
其中,-GPIOx_CRL和-GPIOx_CRH用于配置GPIO的八种模式和三种最大输出速度。
-GPIOx_IDR用于读取IO口输入的电平(0或者1)。
-GPIOx_ODR和-GPIOx_BSRR以及-GPIOx_BRR都是用来设置IO口的输出(0或者1)。
以下为详细解释:
①、-GPIOx_CRL:32位寄存器,只能配置低八位的IO口。
手把手教你STM32笔记

手把手教你STM32笔记stm32f1031、io口处理io口包含7个寄存器配置寄存器两个:crl(32),crh(32)数据寄存器两个:idr(32),odr(32),但是他们就用了16边线位登位寄存器:bsrr(32)登位寄存器:brr(16)锁存寄存器:lckr(32)常用的有前面四个:其中前面两个是用来设置的,后面两个是用来操作的。
每个io 口占用四位进行设置(低两位是mode,高两位是cnf),每组16个,总共需要64个位设置,分别从crl低位开始,到crh的高位结束。
每个io口四位二进制的常用布局:演示输出模式(adc):0x0;推挽输出模式(输出口50mhz):0x3;上/下拉输入模式(输入口用):0x8;复用输出(第二供能):0xb;stm32f407自学笔记1、系统时钟的设置:stm32_clock_init(168,4,2,7);参数分别就是:plln,pllm,pllp,pllqhse分频pllm之后为vco的输入,一般vco的输入要求为1~2mhz,一般建议取为2mhz,防止pll抖动。
vco输出是输入的plln倍频,sysclk在去pll输出时,sysclk=pll=hse/pllm*plln/pllp而pllq是为48mhz时钟配置用的,clk48=hse/pllm*plln/pllq所以要设置系统时钟为168mhz时候推荐的参数取值为sysclk=pll=hse/pllm*plln/pllp=8/4*168/2=168mhzclk48=hse/pllm*plln/pllq=8/4*168 /7=48mhz2、延时函数设置:delay_init(168);延时函数参数为系统时钟sysclk初始化后就可以调用延时函数:delay_ms(ms);参数不能大于65536,因为参数是16位数delay_us(us);参数不能大于7989153、普通io的使用a.首先是使能时钟rcc->ahb1enr|=1<<5;在该寄存器适当的边线1即可b.io口模式设置:gpio_set(gpiof,pin9|pin10,gpio_mode_out,gpio_otype_pp,gpio_speed_100m,gpio_pup d_pu);参数分别就是:gpiox,pin9|pin10(具体对应的口,可以使用与的关系)因为每种占一位#definepin0#definepin1#definepin2#definepin3#definepin4#definepin5#definepin6#definepin7#definepin8#definepin9#definepin10#definepin11#definepin12#definepin 13#definepin14#definepin151<<01<<11<<21<<31<<41<<51<<61<<71<<81<<91<<101<<111<<121<<131<<141<<15mode:四种,各个模式只能设置一种#definegpio_mode_in0#definegpio_mode_out//普通输出模式1//普通输出模式#definegpio_mode_af#definegpio_mode_ain输入推挽或者开漏挑选:#definegpio_otype_pp#definegpio_otype_od23//af功能模式//演示输出模式01//推挽输入//开漏输入推挽输出可输出强的高、低电平,用于连接数字器件开漏输入相等于三极管的集电极,电流型驱动,只可以输入弱的低电平,高电平需外扎。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
LED0=1;
•
LED1=0;
•
delay_ms(300);
•
}
•}
第二章 跑马灯实验
• Led.c函数
• void LED_Init(void)
•{
•
RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
GPIOA->CRH|=0XFFFFFFFF3;//PA8 推挽输出
•
GPIOA->ODR|=1<<8; //PA8 输出高
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
• }要想实现一个点亮led小灯的功能,最少只需对3个寄存器进行设 置,第一步是设置外设时钟使能先把PORTA时钟使能,接下来把IO
口设置为输出,在接下来设置输出为高电平还是低电平,这里使用 推挽输出(3.3v),推挽输出主要是增强驱动能力,为外部提供大电 流。
第二章 跑马灯实验
• #ifndef __LED_H • #define __LED_H • #include "sys.h" • #define LED0 PAout(8)// PA8 • #define LED1 PDout(2)// PD2 • void LED_Init(void);//初始化
第一章 建立工程
• Stm32在新建工程是时应该注意的事项。 • 1.选择芯片型号之后,进入工程,此时应该添加文件夹,
即选择Mange Components,要知道,在这里添加的文件 夹都会在目录树上显示出来,在这些文件夹之内添加的 应该是.C的文件。 • 2.应该注意当你想建立一个新的文件时,一定先要建立 一个文件以.C或者.h的形式保存在该文件夹之下,之后 再进行添加。
•
Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发
• • •}
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2 MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
•{
•
RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
•
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
•
GPIOA->CRL|=0X00000008;
•
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
• 3.建立.h文件,.h文件是用来保存一些宏定义和一些函 数声明的,这样能够使函数看起来更加清晰,所以在这 里一定要把各个.h函数的路径添加到工程里面。
第二章 跑马灯实验
• 主函数:
• int main(void)
•{
•
Stm32_Clock_Init(9); //系统时钟设置,把PLL设置为9,比如说当前的时钟为8Mhz,那
第三章 键盘
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发 Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2 MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2 接下来分析一下中断的设置,Ex_NVIC_Config(GPIO_A,13,FTIR),这个中断 设置函数比较简单,里面有三个参数,从前之后依次设置的是GOIO_X, BITX,以及电平触发方式。 MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢 占2,子优先级2,组2,这是一个比较复杂的中断管理函数,里面有4个 参数,分别是中断抢占优先级,中断子优先级,中断编号,中断分组。 这里把所有的按键都分配到了第二组,把按键的抢占优先级设置成了一 样,而次优先级不同,KEY0和KEY1的子优先级大于WKUP。
格式应用: • #endif • #ifndef x //先测试x是否被宏定义过 • #define x • 程序段1 //如果x没有被宏定义过,定义x,并编译程序段1
第三章 键盘
• 在本章的学习中,首先利用外部中断函数来实现键盘的功能。首先先来研究一下外部中断函数:
• void EXTIX_Init(void)
第三章 键盘
• RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
•
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
• 在这里要知道如何看寄存器,当使用|=时就是要利用他的置1功能, 当使用&=时,就要使用它的置0功能。<<是循环左移的意思,移的内 容在符号左边的,符号右边表示要移动的位数。
么stm32将在72MHz的速度下运行。
•
delay_init(72);
//延时初始化,该参数用来指定延时需要延长的微妙数,括号
//内的参数为系统时钟频率
•
LED_Init();
//初始化与LED连接的硬件接口
•
while(1)
•
{
•
LED0=0;
•
LED1=1;
•
delay_ms(300); //该参数用来指定需要延时的毫秒数
•
GPIOA->CRH|=0X80800000;
•
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
•
GPIOA->ODR|=1<<15; //PA15上拉
•
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
•பைடு நூலகம்
Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发