紧接上个帖子新建的工程模板:
https://bbs.eeworld.com.cn/forum. ... 3&page=1#pid2101475
有兴趣的朋友可以自己按照我的步骤一步一步,自己建个工程模板。
下面,我们使用昨天新建的工程模板,开始今天的主题,点亮LED。
首先,选择使用的led,从769discovery的原理图可见,
选用比较明显的2个LED灯,红和绿。占用的IO口分别是PJ13,PJ5
再看看参考手册的6.3.2 I/O pin alternate function multiplexer and mapping page220
其中有段描述
GPIO: configure the desired I/O as output, input or analog in the GPIOx_MODER
register.
• Peripheral alternate function:
– Connect the I/O to the desired AFx in one of the GPIOx_AFRL or GPIOx_AFRH
register.
– Select the type, pull-up/pull-down and output speed via the GPIOx_OTYPER,
GPIOx_PUPDR and GPIOx_OSPEEDER registers, respectively.
– Configure the desired I/O as an alternate function in the GPIOx_MODER register.
从这段描述中可发现,要想配置IO作为输出,直接配置
GPIOx_MODER,GPIOx_OTYPER,GPIOx_PUPDR and GPIOx_OSPEEDER,这4个寄存器即可,AFRx寄存器可以不搭理。
于是仔细看看这4个寄存器的详细说明。
很幸运,4个在一起,肩并肩的,如图
GPIOx_MODER的说明如下:
Bits 2y+1:2y MODERy[1:0]: Port x configuration bits (y = 0..15)
These bits are written by software to configure the I/O mode.
00: Input mode (reset state)
01: General purpose output mode
10: Alternate function mode
11: Analog mode
如果设置为输出,只需要配置寄存器相应的位置为01即可。
另外3个类似,不多言。
下面开始最重要的环节,进入编程
打开昨天建的工程模板。
添加如下代码。
int main(void)
{
SystemInit();
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOJEN;
GPIOJ->MODER &= ~((3 << 10) | (3 << 26));
GPIOJ->MODER |= (1 << 10) | (1 << 26);
GPIOJ->OSPEEDR &= ~((3 << 10) | (3 << 26));
GPIOJ->OSPEEDR |= (2 << 10) | (2 << 26);
GPIOJ->OTYPER = ~((1 << 5) | (1 << 13));
GPIOJ->PUPDR &= ~((3 << 10) | (3 << 26));
GPIOJ->PUPDR |= (1 << 10) | (1 << 26);
while(1)
{
GPIOJ->ODR ^= (1 << 5) | (1 << 13);//IO口翻转
}
}
在IO翻转处设置断点,或单步调试即可发现2个LED,一起亮,一起灭。见下图
系统时钟的配置暂时先用工程提供的,下一步实现系统时钟的寄存器配置,然后开始UART的寄存器配置试验。
今天先到这。
点击此处,查看STM32F769I开发板官方资源。