简单私密文件分享服务
端到端的加密分享文件,链接到期即焚.
https://send.firefox.com/
端到端的加密分享文件,链接到期即焚.
https://send.firefox.com/
实验要求:
开发板PB9连接"按键"一端,"按键"另一端连接地。当按下"按键"时,蓝色LED灯状态进行翻转,由点亮变熄灭或由熄灭变点亮。
关键程序:
/**
void initKey(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //设置按键对应引脚 PB9 GPIO_InitStructure.GPIO_Mode = **GPIO_Mode_IPU; //设置上拉输入** GPIO_Init(GPIOB, &GPIO_InitStructure); //设置生效 }
/****main.c************/ #include "LED/LED.h" #include "KEY/KEY.h" #include "DELAY/DELAY.h" #include "stm32f10x.h" int main(void) { initLED(); //初始化LED Delay_init(); //延时初始化 initKey(); //初始化按键引脚 Delay_ms(100); R_LED_OFF; G_LED_OFF; Y_LED_OFF; while (1) { //红绿黄流水灯 R_LED_ON; Delay_ms(200); R_LED_OFF; G_LED_ON; Delay_ms(200); G_LED_OFF; Y_LED_ON; Delay_ms(200); Y_LED_OFF; //当按下按键并且黄色LED灯熄灭时 , 改变蓝色LED状态 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0) { toggleLED();//改变蓝色LED状态 } } }
1.SysTick 定时器介绍
Systick定时器就是系统滴答定时器,一个24位的“倒计数” 定时器,计到0时(溢出),触发中断或者设置【溢出】标志位,并将从RELOAD寄存器中自动重装载定时初值。只要SysTick控制及状态寄存器中的使能位未清除,就永不停息,即使在睡眠模式下也能工作。
Systick相关寄存器:
CTRL :SysTick 控制和状态寄存器
LOAD :SysTick 自动重装载初值寄存器 ---(设置后自动重载值固定不变,最大2^24)
VAL :SysTick 当前值寄存器 ---(每个时钟周期减1,减到0重新装载LOAD的值)
下载excel文件
2.定时器/计数器 计时原理
定时器从本质上来讲其实就是一个计数器,先给它设置一个初始计数值,它每收到一个脉冲,计数器就会减1,当减到0时,产生一个“叮”的信号,告知我们定时时间到。
定时时间 = 接收到的脉冲个数 * 单个脉冲的周期
STM32F103的工作时钟为72MHz,经过8分频后给SysTick 计数器用。此时计数器接收到的脉冲信号的频率为72/8=9Mhz, 单个脉冲的周期= 1 / (9MHz)= 1/9 us
如果给SysTick 计数器设置初始计数值RELOAD为9,则计数器每接收9个计数脉冲所需要的时间为9 ×(1/9 us)= 1 us.
如果给SysTick 计数器设置初始计数值RELOAD为9 × 1000,则计数器每接收9 × 1000个计数脉冲所需要的时间为9 × 1000 × (1/9 us)= 1000 us = 1 ms.
Systick定时器是24 位的倒计数定时器,RELOAD最大为2^24 = 16777216
16777216 ×(1/9 us)=1864135 us = 1.86 秒
滴答定时器通过查询“计数标志位COUNTFLAG”实现延时:
/**
*/
#include "DELAY/Delay.h"
/**
void Delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频
}
/**
void Delay_us(u32 xus)
{
SysTick->LOAD = 9 * xus; //计9次为1us,xus则重装载值要*9
SysTick->VAL = 0; //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开定时器
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成
}
/**
void Delay_ms(u32 xms)
{
SysTick->LOAD = 9000; //计9次为1us,1000次为1ms
SysTick->VAL = 0; //计数器归零
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开定时器
while (xms--)
{
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
}
}
//回调函数
int mycallback(int x){
return x*x;
}
/某个应用函数app,调用了另一个自定义回调函数/
int app(int x,int y,int (*callback)(int) )
{
int c=(*callback)(x) + y;
return c*c;
}
int main()
{
printf("%d",app(20,30,mycallback));
return 0;
}