Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильность объявления define 
:(
    Опции темы
supercelt
Дата 10.9.2016, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Код

#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. Как в таком случае сделать дефайны? И ещё вроде говорят, что дефайны много памяти едят?
PM   Вверх
a0730
Дата 12.9.2016, 06:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Попробуй описать 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;



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
a0730
Дата 12.9.2016, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Попробуй описать 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;



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
a0730
Дата 12.9.2016, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Попробуй описать 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;



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
xvr
Дата 12.9.2016, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Если вы еще не бросились все переписывать на битовые поля  smile , то можно сделать простыми макросами на основе макросов Аскольда Волкова. Как то так:
Код

#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 Найти цитируемый пост)
 И ещё вроде говорят, что дефайны много памяти едят? 

С чего бы вдруг? Дефайны вообще в С компилятор не попадают - их препроцессор заменяет на текст перед компиляцией

PM MAIL   Вверх
supercelt
Дата 12.9.2016, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Спасибо за ответы, попробую
PM   Вверх
bsa
Дата 20.9.2016, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



supercelt, мой опыт работы с МК говорит о том, что все это бестолку. В новом проекте все будет сильно иначе. Поэтому, дроби всё на мелкие функции, в которые будут спрятаны низкоуровневые операции с портами и битами. В новом проекте тебе нужно будет менять лишь их.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.