s.a.t.8简直就是世界上最最最可爱的人形,没有之一!!!
看看这完美的身材,看看这亮丽的头发,看看这可爱的脸庞,aaaaaaaaaaawsl。
真想把小狮子抱在自己身上,然后花一下午的时间帮她把头发给一点一点捋直(桃饱网会员预定)。
ufhsykg的博客
s.a.t.8简直就是世界上最最最可爱的人形,没有之一!!!
看看这完美的身材,看看这亮丽的头发,看看这可爱的脸庞,aaaaaaaaaaawsl。
真想把小狮子抱在自己身上,然后花一下午的时间帮她把头发给一点一点捋直(桃饱网会员预定)。
欢迎收看今天的“小狮子 带侦探”!我是最可爱的人形s.a.t.8。在后勤官格林娜小姐的指挥下指挥部所有的人形对整个指挥部区域进行了地毯式搜索,在指挥室中的电脑里我们又发现了一串可疑的代码:
;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s ;* Author : MCD Application Team ;* Version : V3.5.0 ;* Date : 11-March-2011 ;* Description : STM32F10x High Density Devices vector table for MDK-ARM ;* toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Configure the clock system and also configure the external ;* SRAM mounted on STM3210E-EVAL board to be used as data ;* memory (optional, to be enabled by user) ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> ;******************************************************************************* ; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS ; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. ; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, ; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE ; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING ; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. ;******************************************************************************* ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 DCD ADC1_2_IRQHandler ; ADC1 & ADC2 DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 DCD CAN1_SCE_IRQHandler ; CAN1 SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare DCD TIM2_IRQHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend DCD TIM8_BRK_IRQHandler ; TIM8 Break DCD TIM8_UP_IRQHandler ; TIM8 Update DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare DCD ADC3_IRQHandler ; ADC3 DCD FSMC_IRQHandler ; FSMC DCD SDIO_IRQHandler ; SDIO DCD TIM5_IRQHandler ; TIM5 DCD SPI3_IRQHandler ; SPI3 DCD UART4_IRQHandler ; UART4 DCD UART5_IRQHandler ; UART5 DCD TIM6_IRQHandler ; TIM6 DCD TIM7_IRQHandler ; TIM7 DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP ; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ENDP HardFault_Handler\ PROC EXPORT HardFault_Handler [WEAK] B . ENDP MemManage_Handler\ PROC EXPORT MemManage_Handler [WEAK] B . ENDP BusFault_Handler\ PROC EXPORT BusFault_Handler [WEAK] B . ENDP UsageFault_Handler\ PROC EXPORT UsageFault_Handler [WEAK] B . ENDP SVC_Handler PROC EXPORT SVC_Handler [WEAK] B . ENDP DebugMon_Handler\ PROC EXPORT DebugMon_Handler [WEAK] B . ENDP PendSV_Handler PROC EXPORT PendSV_Handler [WEAK] B . ENDP SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B . ENDP Default_Handler PROC EXPORT WWDG_IRQHandler [WEAK] EXPORT PVD_IRQHandler [WEAK] EXPORT TAMPER_IRQHandler [WEAK] EXPORT RTC_IRQHandler [WEAK] EXPORT FLASH_IRQHandler [WEAK] EXPORT RCC_IRQHandler [WEAK] EXPORT EXTI0_IRQHandler [WEAK] EXPORT EXTI1_IRQHandler [WEAK] EXPORT EXTI2_IRQHandler [WEAK] EXPORT EXTI3_IRQHandler [WEAK] EXPORT EXTI4_IRQHandler [WEAK] EXPORT DMA1_Channel1_IRQHandler [WEAK] EXPORT DMA1_Channel2_IRQHandler [WEAK] EXPORT DMA1_Channel3_IRQHandler [WEAK] EXPORT DMA1_Channel4_IRQHandler [WEAK] EXPORT DMA1_Channel5_IRQHandler [WEAK] EXPORT DMA1_Channel6_IRQHandler [WEAK] EXPORT DMA1_Channel7_IRQHandler [WEAK] EXPORT ADC1_2_IRQHandler [WEAK] EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] EXPORT CAN1_RX1_IRQHandler [WEAK] EXPORT CAN1_SCE_IRQHandler [WEAK] EXPORT EXTI9_5_IRQHandler [WEAK] EXPORT TIM1_BRK_IRQHandler [WEAK] EXPORT TIM1_UP_IRQHandler [WEAK] EXPORT TIM1_TRG_COM_IRQHandler [WEAK] EXPORT TIM1_CC_IRQHandler [WEAK] EXPORT TIM2_IRQHandler [WEAK] EXPORT TIM3_IRQHandler [WEAK] EXPORT TIM4_IRQHandler [WEAK] EXPORT I2C1_EV_IRQHandler [WEAK] EXPORT I2C1_ER_IRQHandler [WEAK] EXPORT I2C2_EV_IRQHandler [WEAK] EXPORT I2C2_ER_IRQHandler [WEAK] EXPORT SPI1_IRQHandler [WEAK] EXPORT SPI2_IRQHandler [WEAK] EXPORT USART1_IRQHandler [WEAK] EXPORT USART2_IRQHandler [WEAK] EXPORT USART3_IRQHandler [WEAK] EXPORT EXTI15_10_IRQHandler [WEAK] EXPORT RTCAlarm_IRQHandler [WEAK] EXPORT USBWakeUp_IRQHandler [WEAK] EXPORT TIM8_BRK_IRQHandler [WEAK] EXPORT TIM8_UP_IRQHandler [WEAK] EXPORT TIM8_TRG_COM_IRQHandler [WEAK] EXPORT TIM8_CC_IRQHandler [WEAK] EXPORT ADC3_IRQHandler [WEAK] EXPORT FSMC_IRQHandler [WEAK] EXPORT SDIO_IRQHandler [WEAK] EXPORT TIM5_IRQHandler [WEAK] EXPORT SPI3_IRQHandler [WEAK] EXPORT UART4_IRQHandler [WEAK] EXPORT UART5_IRQHandler [WEAK] EXPORT TIM6_IRQHandler [WEAK] EXPORT TIM7_IRQHandler [WEAK] EXPORT DMA2_Channel1_IRQHandler [WEAK] EXPORT DMA2_Channel2_IRQHandler [WEAK] EXPORT DMA2_Channel3_IRQHandler [WEAK] EXPORT DMA2_Channel4_5_IRQHandler [WEAK] WWDG_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler DMA1_Channel1_IRQHandler DMA1_Channel2_IRQHandler DMA1_Channel3_IRQHandler DMA1_Channel4_IRQHandler DMA1_Channel5_IRQHandler DMA1_Channel6_IRQHandler DMA1_Channel7_IRQHandler ADC1_2_IRQHandler USB_HP_CAN1_TX_IRQHandler USB_LP_CAN1_RX0_IRQHandler CAN1_RX1_IRQHandler CAN1_SCE_IRQHandler EXTI9_5_IRQHandler TIM1_BRK_IRQHandler TIM1_UP_IRQHandler TIM1_TRG_COM_IRQHandler TIM1_CC_IRQHandler TIM2_IRQHandler TIM3_IRQHandler TIM4_IRQHandler I2C1_EV_IRQHandler I2C1_ER_IRQHandler I2C2_EV_IRQHandler I2C2_ER_IRQHandler SPI1_IRQHandler SPI2_IRQHandler USART1_IRQHandler USART2_IRQHandler USART3_IRQHandler EXTI15_10_IRQHandler RTCAlarm_IRQHandler USBWakeUp_IRQHandler TIM8_BRK_IRQHandler TIM8_UP_IRQHandler TIM8_TRG_COM_IRQHandler TIM8_CC_IRQHandler ADC3_IRQHandler FSMC_IRQHandler SDIO_IRQHandler TIM5_IRQHandler SPI3_IRQHandler UART4_IRQHandler UART5_IRQHandler TIM6_IRQHandler TIM7_IRQHandler DMA2_Channel1_IRQHandler DMA2_Channel2_IRQHandler DMA2_Channel3_IRQHandler DMA2_Channel4_5_IRQHandler B . ENDP ALIGN ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF END ;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****
经过技术分析后我们得知这是前几次电子板的启动文件,上边的代码分别实行了一下功能:
首先,定义栈,何为栈?栈是堆栈中的一部分,而堆栈则是为了分配在运行函数时所需分配的内存空间,栈的目的就是将函数从第一行依次录入一个空间,这个空间就是栈;相应的,有栈就要有堆,所以第二段就是定义堆,堆的作用就是从栈中读取函数,同样也是依次读取并将读取的语句存入内存最后由cpu来执行功能。
然后声明中断函数,并根据4字节的长度来分配内存空间,接着编写中断函数的代码。
接下来就到了最重要的一步,将系统时钟函数放入r0寄存器运行完后清除,再将用户程序也就是main放入r0寄存器运行完后清楚,这里可能有人要问了为什么运行完后要清除?因为我们的内存空间是有限的不能无限制让一个已经运行完的程序当钉子户,否则会导致机器越用越卡越用越慢,所以以后在对内存进行操作的时候一定要时刻记得“用完就扔”的原则。
最后就是将用户自己编写的函数放到堆栈中并分配到内存,总共有4个寄存器被分配给了堆栈,r0被分配给了堆的起始地址,r2被分配给了堆的大小,r3被分配给了栈顶指针,r1被分配给了栈的大小。
Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
这三行代码诠释了栈的起始指针和栈的大小:首先将内存中0x00000400声明成了stack_size,再将stack_size(也就是0x00000400)作为内存地址分配给了stack_mem从而达到了设置栈顶指针的目的,再将两者相加就达到了栈的大小。
Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit
那么同理这三行代码诠释了堆的起始地址和堆的大小。
我们查询了这段代码发送的地址,发现是由一个叫均鞭的用户在英国赫里福基地发出的,为了查询事情的真相并找回失踪的指挥官,我!最可爱的人形小狮子将会第一时间赶赴现场为大家带来第一手资讯,请大家继续关注下一期的“小狮子 带侦探”!
欢迎收看今天的“小狮子,带侦探”!上次我们在指挥官的卧室里发现了散发诡异光芒的小灯和一串神秘的代码。今天我们在指挥部后面的小花园里又发现了一个奇怪的装置,这个装置被遗弃在了灌木丛中,但是!我,最可爱的人型s.a.t.8依旧找到了这重要的线索!话不多说,让我们康康今天的带发现吧!
#include "stm32f10x.h" #include "led.h" void Delay(uint32_t jun){ for(;jun!=0;--jun); } int main(void){ int a=1,b=0; led_gpio_sb(); led_gpio_yw(); while(1){ while(a==1){ if(key_scan(K1_GPIO_PORT,LED_K1_GPIO_PIN)==KEY_ON||b==1){ led_gpio_config(); led_gpio_JUN(); led_gpio_BIAN(); while(a==1){ LED_G(ON); LED_B(OFF); LED_R(OFF); Delay(0xFFFFF); if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){ a=0; LED_G(OFF); LED_B(OFF); LED_R(OFF); break;} LED_G(OFF); LED_B(ON); LED_R(OFF); Delay(0xFFFFF); if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){ a=0; LED_G(OFF); LED_B(OFF); LED_R(OFF); break;} LED_G(OFF); LED_B(OFF); LED_R(ON); Delay(0xFFFFF); if(key_scan(K2_GPIO_PORT,LED_K2_GPIO_PIN)==KEY_ON){ a=0; LED_G(OFF); LED_B(OFF); LED_R(OFF); break; } } } if(a==0) break; } if(key_scan(K1_GPIO_PORT,LED_K1_GPIO_PIN)==KEY_ON){ a=1; b=1; } } }
#include "led.h" void led_gpio_config(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_G_GPIO_PIN; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_JUN(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_B_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_BIAN(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_R_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_sb(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(K1_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_K1_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(K1_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_yw(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(K2_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_K2_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(K2_GPIO_PORT, &GPIO_InitStruct); } uint8_t key_scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin){ if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON){ while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON); return KEY_ON; } else return KEY_OFF; }
#ifndef led_h #define led_h #include "stm32f10x.h" #define LED_G_GPIO_PIN GPIO_Pin_0 #define LED_R_GPIO_PIN GPIO_Pin_5 #define LED_B_GPIO_PIN GPIO_Pin_1 #define LED_G_GPIO_PORT GPIOB #define K1_GPIO_PORT GPIOA #define K2_GPIO_PORT GPIOC #define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB #define K1_G_GPIO_CLK RCC_APB2Periph_GPIOA #define K2_G_GPIO_CLK RCC_APB2Periph_GPIOC #define LED_K1_GPIO_PIN GPIO_Pin_0 #define LED_K2_GPIO_PIN GPIO_Pin_13 #define ON 1 #define OFF 0 #define LED_G(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); #define LED_B(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN); #define LED_R(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN); void led_gpio_config(void); void led_gpio_JUN(void); void led_gpio_BIAN(void); void led_gpio_sb(void); void led_gpio_yw(void); uint8_t key_scan(GPIO_TypeDef *GPIO,uint16_t GPIO_Pin); #define KEY_ON 1 #define KEY_OFF 0 #define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_G_GPIO_PIN;} #define LED_R_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_R_GPIO_PIN;} #define LED_B_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_B_GPIO_PIN;} #endif
乍一看,这个装置没什么亮点,但是当我们打开开关摁下key1按钮后发现这个装置上的led灯竟然开始闪烁了,当我们再摁下key2按钮后发现led灯竟然熄灭了。这次的发现比上次的更加劲爆,很显然指挥官的失踪并不是无端发生的,这次的装置和上次的装置一定是指挥官留下的线索。后勤官格林娜知道后第一时间来到了现场,在看过代码后,格林娜小姐说这次的代码和上次的有明显的不同,因为上次只有输出而这次却有了输入,通过对输入检测的编写可以让设备接受到信号并作出预先设计好的反应。
格林娜小姐在分析完决定调用格里芬指挥部的力量进行地毯式搜索,想要知道下一次的线索吗?那就继续关注“小狮子,带侦探”吧!我是最可爱的人形s.a.t.8,期待与您分享关于指挥官失踪的第一手资讯。
欢迎来到今天的“小狮子 带侦探”,我是最可爱的战术人形s.a.t.8!今天我们在指挥官的卧室里找到一块奇怪的电路板,上面的led灯在闪烁着诡异的光芒。在把电路板送给后勤官格林娜做了简单的分析后发现了如下代码:
#include "stm32f10x.h" #include "led.h" void Delay(uint32_t jun){ for(;jun!=0;--jun); } int main(void){ led_gpio_config(); led_gpio_JUN(); led_gpio_BIAN(); while (1) { LED_G(ON); LED_B(OFF); LED_R(OFF); Delay(0xFFFFF); LED_G(OFF); LED_B(ON); LED_R(OFF); Delay(0xFFFFF); LED_G(OFF); LED_B(OFF); LED_R(ON); Delay(0xFFFFF); LED_G(ON); LED_B(ON); LED_R(OFF); Delay(0xFFFFF); LED_G(ON); LED_B(OFF); LED_R(ON); Delay(0xFFFFF); LED_G(ON); LED_B(OFF); LED_R(ON); Delay(0xFFFFF); LED_G(OFF); LED_B(ON); LED_R(ON); Delay(0xFFFFF); LED_G(ON); LED_B(ON); LED_R(ON); Delay(0xFFFFF); } }
#include "led.h" void led_gpio_config(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_G_GPIO_PIN; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_JUN(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_B_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); } void led_gpio_BIAN(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin=LED_R_GPIO_PIN ; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); }
#ifndef led_h #define led_h #include "stm32f10x.h" #define LED_G_GPIO_PIN GPIO_Pin_0 #define LED_R_GPIO_PIN GPIO_Pin_5 #define LED_B_GPIO_PIN GPIO_Pin_1 #define LED_G_GPIO_PORT GPIOB #define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB #define ON 1 #define OFF 0 #define LED_G(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); #define LED_B(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN); #define LED_R(JUN) if(JUN)GPIO_ResetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);else GPIO_SetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN); void led_gpio_config(void); void led_gpio_JUN(void); void led_gpio_BIAN(void); #endif
后勤官格林娜表示她曾经有在军校时有学过代码,这里面的意思好像是先对官方固件库中的变量进行声明,再自己写一个函数并将刚才的声明过的变量写进去,最后再将写好的函数放到main函数中,以此来完成开关电路板芯片中的时钟,决定gpio输入输出模式和速度以及哪个引脚需要输出高低点平。最后通过while函数和delay进行闪烁。
在指挥官卧室发现的电路板的工作原理知道了,但指挥官为什么要干这件事呢?这里的代码和上次在指挥官办公室发现的又有什么关系呢?想知道真相的观众们敬请期待下一次的“小狮子 带侦探”!
这里是s.a.t.8为您带来的关于指挥官临阵脱逃的第一手资讯。今天一整天,别的指挥官都在忙着和白色势力作斗争但是我们的指挥官却失踪了,经过我们的搜索发现在指挥官办公桌上发现了一串神奇的代码
typedef unsigned int uint32_t; typedef struct { uint32_t CRL; uint32_t CRH; uint32_t IDR; uint32_t ODR; uint32_t BSRR; uint32_t BRR; uint32_t LCKR; }GPIO #define JUN ((GPIO*)GPIOB)
没有人知道这是什么意思,但我们在旁边找到一些字迹好像是指挥官自己亲手写的:“在对stm32进行编程的时候可以使用自己预先写好的寄存器结构体来进行编程,这种方法和昨天使用的直接使用寄存器编程有一定的区别,这是一种新的技术还需多多使用才能把它牢固地掌握。在今天的研究中发现在使用此方法时需要注意在定义结构体的名字时要将名字定义在大括号下面否则就要再定义一个别名。使用define时切忌不要加分号“;”否则会报错(因为这个问题困扰了我整整1个小时)。”
这是指挥官在这段代码旁留下的语句,我们不知道这有什么确切的含义,但有一点肯定的是指挥官正在进行一些秘密研究。
s.a.t.8会继续跟进这个事件,想要知道真相的人形们一定要第一时间收看我们的“小狮子 带侦探”哦!