Нужен совет

Информация из первых уст

Наши авторы

Иван Парфенов

Кирилл Анофриев

Павел Егоров

Анна Киросова

Как восстановить электронную книгу

Есть способ для программного восстановления электронных книг - портативных медиа плееров. Способ работает на книгах фирм Effire, Ritmix, Texet, Teclast и др китайского производства. 
 

Подключение внешнего Wi-Fi адаптера к планшету на андроид 4

#!/system/bin/sh

 

ip link set wlan0 down

iwconfig wlan0 channel auto

iwconfig wlan0 Bit 54Mb/s

iwconfig wlan0 essid 'SSID name'

sleep 10

 

Пример работы с прерыванием на STM32F103

В данном примере я расскажу как реализовать работу с внешним прерыванием на микроконтроллере STM32F103.

Данный код, прошитый через J-Link адаптер работает на плате Maple Mini (китайский клон). При нажатии на пользовательскую кнопку происходит включение-выключение светодиода на плате. 

// set / reset LED on pin PB1 by usr btn press
// btn pin D32 - PB8 - EXTI8
 
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "misc.h" 
 
GPIO_InitTypeDef gpio;
EXTI_InitTypeDef usr_btn_exti;
NVIC_InitTypeDef NVIC_InitStructure;
 
void gpio_init(void) {
// enable clocking GPIOB block
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
// set output for led pin PB1
 GPIO_StructInit(&gpio);
 gpio.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio.GPIO_Pin = GPIO_Pin_1;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &gpio);
 
// set floating input for usr btn PB8
 gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    gpio.GPIO_Pin = GPIO_Pin_8;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &gpio);
}
 
void IT_init(void){
 
// enable clocking AFIO block - need to set alt function to PB8 usb btn pin
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 
// connect usr btn PB8 pin to EXTI Line (datasheet says PB8 connected to EXTI_Line8)
// depend on AFIO block
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
 
// Setup and Enable EXTI Line8
usr_btn_exti.EXTI_Line = EXTI_Line8;
usr_btn_exti.EXTI_Mode = EXTI_Mode_Interrupt;
usr_btn_exti.EXTI_Trigger = EXTI_Trigger_Rising;
usr_btn_exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&usr_btn_exti);
 
/* Enable and setup EXTI priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // because lines 5 to 9 - are in one block
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
 
// all interrupts for lines 5 to 9 will be handle here
void EXTI9_5_IRQHandler(void) {
// only for line8 events will execute
if (EXTI_GetITStatus(EXTI_Line8) != RESET) {
 
if (!GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1)) {
GPIO_SetBits(GPIOB, GPIO_Pin_1); }
else {
GPIO_ResetBits(GPIOB, GPIO_Pin_1); }
 
EXTI_ClearITPendingBit(EXTI_Line8); // exit from interrupt
}
// here may be functions for other interrups from lines 5 to 9
}
 
int main()
{
gpio_init();
IT_init();
 
    while(1) {};
}