Правильность объявления define

 
0
 
C++
ava
supercelt | 10.09.2016, 21:52

#include "keyboard.h"

#define OUT_PIN1 5
#define OUT_PIN2 6
#define OUT_PIN3 7
#define OUT_PIN4 8

#define IN_PIN1 11
#define IN_PIN2 12
#define IN_PIN3 13
#define IN_PIN4 14

#define KEYBOARD_PORT GPIOB
#define KEYBOARD_PORT_CMD RCC_APB2ENR_IOPBEN

uint8_t timer_flag = 0;
uint8_t count_scan = 0;
uint8_t count_up = 0;
uint8_t count_down = 0;
uint16_t key = 0;
uint16_t old_key = 0;
uint16_t find_key = 0;
unsigned char cols[] = {5,6,7,8};

void TIM2_IRQHandler(void){
        TIM2->SR = 0; 
        timer_flag = 1;
        
}                                             

void KEYBOARD_INI(void){
        RCC->APB2ENR |= KEYBOARD_PORT_CMD | RCC_APB2ENR_AFIOEN;             //CMD PORT B. cmd alt func
        KEYBOARD_PORT->CRH &= ~(GPIO_CRH_CNF11_0 | GPIO_CRH_CNF12_0 | GPIO_CRH_CNF13_0 | GPIO_CRH_CNF14_0);        //Scan Pins: PB11, PB12, PB13, PB14.
        KEYBOARD_PORT->CRH |= GPIO_CRH_CNF11_1 | GPIO_CRH_CNF12_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1;         //Input Push-down.
      KEYBOARD_PORT->CRL &= ~(GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0);       //Generate Pins: PB5, PB6, PB7, PB8.
        KEYBOARD_PORT->CRH &= ~GPIO_CRH_CNF8_0;
        KEYBOARD_PORT->CRL |= GPIO_CRL_MODE5_1 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1;        //Output Push-pull.
    KEYBOARD_PORT->CRH |= GPIO_CRH_MODE8_1;    
        KEYBOARD_PORT->BSRR = 0x1E0;


Это кусок кода на СИ, под микроконтроллер. Вот столкнулся с такой проблемой. Сначала код был без дефайнов,  всё было прописано как есть. Но я подумал., что если сменится порт, то лучше исправить его в одном месте, чем во всей программе. И вот вопрос. Пины то я задефайнил и порт. А вот в ф-ии  KEYBOARD_INI идёт настройка входов и выходов, конфигурацией регистров CRL и CRH. То есть получается мне надо делать отдельные дефайны для каждого GPIO_CRH_CNF11_0 | GPIO_CRH_CNF12_0 | GPIO_CRH_CNF13_0 | GPIO_CRH_CNF14_0? Знаюч что проще использовать STD periph, но не хочу. Надо всё оставить на CMSISe. Как в таком случае сделать дефайны? И ещё вроде говорят, что дефайны много памяти едят?
Ответы (4)
ava
a0730 | 12.09.2016, 06:12 #
Попробуй описать CRH как набор битовых полей.

struct
{
    unsigned short BITS03:4;
    unsigned short BIT4:1;
    unsigned short BIT5:1;
    unsigned short BITS67:2;
} CRH;

и ставить или гасить биты

CRH.BIT5=0;
CRH.BITS03=2;

ava
xvr | 12.09.2016, 12:34 #
Если вы еще не бросились все переписывать на битовые поля  :wink , то можно сделать простыми макросами на основе макросов Аскольда Волкова. Как то так:

#define IN_PIN1 11,H
#define IN_PIN2 12,H

#define CR_(bit,part,suf) GPIO_CR##part##_CNF##bit##_##suf
#define CR(pin,suf) CR_(Pin,suf)

...

KEYBOARD_PORT->CRH &= ~(CR(IN_PIN1,0) | CR(IN_PIN2,0));   
...

ну и так далее

Цитата (supercelt @  10.9.2016,  21:52 findReferencedText)
 И ещё вроде говорят, что дефайны много памяти едят? 

С чего бы вдруг? Дефайны вообще в С компилятор не попадают - их препроцессор заменяет на текст перед компиляцией
ava
supercelt | 12.09.2016, 21:07 #
Спасибо за ответы, попробую
ava
bsa | 20.09.2016, 11:34 #
supercelt, мой опыт работы с МК говорит о том, что все это бестолку. В новом проекте все будет сильно иначе. Поэтому, дроби всё на мелкие функции, в которые будут спрятаны низкоуровневые операции с портами и битами. В новом проекте тебе нужно будет менять лишь их.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  supercelt ava  bsa   xvr   a0730
advanced
Отправить