Код
void EXTI9_5_IRQHandler (void){
if(EXTI->PR&EXTI_PR_PR6)
{
PS2_Mouse_ISR();
}
EXTI->PR=EXTI_PR_PR6;
NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
}
if(EXTI->PR&EXTI_PR_PR6)
{
PS2_Mouse_ISR();
}
EXTI->PR=EXTI_PR_PR6;
NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
}
Код
void PS2_Mouse_ISR(void){
uint8_t temp;
static uint8_t bit_pos=0;
static uint8_t scancode=0;
temp=HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);
if((bit_pos>=1)&&(bit_pos<=8))
{
scancode=scancode>>1;
if(temp==GPIO_PIN_SET)
scancode|=0x80;
}
bit_pos++;
if(bit_pos>=11)
{
PS2_Mouse_CheckScancode(scancode);
bit_pos=0;
scancode=0;
}
}
uint8_t temp;
static uint8_t bit_pos=0;
static uint8_t scancode=0;
temp=HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);
if((bit_pos>=1)&&(bit_pos<=8))
{
scancode=scancode>>1;
if(temp==GPIO_PIN_SET)
scancode|=0x80;
}
bit_pos++;
if(bit_pos>=11)
{
PS2_Mouse_CheckScancode(scancode);
bit_pos=0;
scancode=0;
}
}
Код
void PS2_Mouse_CheckScancode(uint8_t scan){
static uint8_t count_byte=0;
if(PS2_MOUSE.status==MOUSE_AKTIV)
{
PS2_MOUSE_VAR.buff[count_byte]=scan;
count_byte++;
if(count_byte>=3)
{
count_byte=0;
PS2_MOUSE.status=MOUSE_NEW_DATA;
}
}
}
static uint8_t count_byte=0;
if(PS2_MOUSE.status==MOUSE_AKTIV)
{
PS2_MOUSE_VAR.buff[count_byte]=scan;
count_byte++;
if(count_byte>=3)
{
count_byte=0;
PS2_MOUSE.status=MOUSE_NEW_DATA;
}
}
}
Если брейкпойнт ставлю на строчку PS2_Mouse_CheckScancode(scancode); те после прияния первых 11 бит (это статусный байт он содержит инфу о нажатии о направлении движения) то при дерганье мыши получаю правильный код scancode=0х08 или scancode=0х0А scancode=0х09 . Т е когда делается пауза после принятия первого байта он оказывается верным. Если же без брейкпоинта то принимаю совершенно непонятные цифры. Такое ощущение как если сбивается счетчик bit_pos.
Пробовал объявлять переменные count_byte bit_pos scancode как volatile. Но нет измениния.
Получается если я ставлю брейк после принятия первого байта в сэмпле или даже всех 3 байт они правильные. (по крайней мере первый статусный там перемещение по х и у нужно в динамике смотреть). А как только начинается сплошной поток сэмплов то приходит можно сказать мусор.
Может быть при паузе флаги успевают сбрасываться (в NVIC и EXTI->PR) а при потоке нет и получаю повторные вхождения? Но с
другой стороны скорость мыши не большая. Частота самих импульсов около 12 кГц а частота следования самих сэмплов вообще настраивал 20 сэмплов в секунду.
Подскажите пожалуйста в каком направлении смотреть. Сами функции честно списал у другого автора. Вроде код рабочий да и не такие уж они сложные вроде все прозрачно. Тем более что при остановке считаются биты правильно.