реклама на сайте
подробности

 
 
> TSC (Touch sensing controller) на STM32F051
silovi4
сообщение Sep 19 2013, 14:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-04-13
Пользователь №: 76 577



Выполняю проект по разработке устройства. Нужно реализовать управление сенсорными кнопками. Всего кнопок 14. Контроллер использую только STM32F051.
Вот схема данного устройства: http://www.picshare.ru/view/2993892/
Кнопки расположены вот так: http://www.picshare.ru/view/2993980/
Скачал библиотеку "STM32F0xx_STMTouch_Lib_V1.0.1" на сайте ST, но как с ней работать ума не приложу. Непонятен сам алгоритм работы, что зачем вызывать. Информации по данному контроллеру очень мало.
Прошу помощи по работе с TSC под STM32F051. Кто работал с данной периферией? Есть ли рабочие примеры или документация (желательно на русском, а то с английским не очень дружу)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
silovi4
сообщение Sep 20 2013, 11:01
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-04-13
Пользователь №: 76 577



Я бы и не создавал эту тему если бы не было вопросов sm.gif Мне хотя бы понять алгоритм работы, как и что инициализировать, что запускать. Я кстати сам предпочитаю работать напрямую с регистрами, но в последнее время пристрастился к библиотекам и функциям.
Буду ждать... wink.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 15:28
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(silovi4 @ Sep 20 2013, 15:01) *
Буду ждать... wink.gif

CODE

//-----------------------------------------------------------------------------
// void __inline init_TSC(void)
//-----------------------------------------------------------------------------
void __inline init_TSC(void)
{
//TSC_CR_TSCE_bit = 1;

TSC->CR = (1 << TSC_CR_TSCE);

TSC->CR =
(2 << TSC_CR_CTPH)
| (6 << TSC_CR_CTPL)
| (9 << TSC_CR_SSD)
| (0 << TSC_CR_SSE)
| (1 << TSC_CR_SSPSC)
| (0 << TSC_CR_PGPSC)
| (6 << TSC_CR_MCV)
| (0 << TSC_CR_IODEF)
| (0 << TSC_CR_SYNCPOL)
| (0 << TSC_CR_AM)
| (0 << TSC_CR_START)
| (1 << TSC_CR_TSCE);

TSC->IER =
(1 << TSC_IER_EOAIE)
| (1 << TSC_IER_MCEIE);

TSC->IOSCR = (1 << TSC_G1_IO4); // Cs
TSC->IOCCR = (1 << TSC_G1_IO3);
TSC->IOGCSR = (1 << 0);

}

Кроме этого:

NVIC->ISER[0] = (1 << NVIC_ISER0_TSC) | (1 << NVIC_ISER0_TIM2);

RCC->AHBENR =
(1 << RCC_AHB_IOPA)
| (1 << RCC_AHB_IOPB)
| (1 << RCC_AHB_IOPC)
| (1 << RCC_AHB_IOPD)
| (1 << RCC_AHB_IOPE)
| (1 << RCC_AHB_TSC)
| (1 << RCC_AHB_FLITF)
| (1 << RCC_AHB_SRAM)
| (1 << RCC_AHB_DMA1)
| (0 << RCC_AHB_DMA2);

GPIOA->MODER =
(GPIO_MODE_ALTERNATE << GPIO_MODER_PIN1)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN2)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN3)
| (GPIO_MODE_ANALOG << GPIO_MODER_PIN4)
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN8)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN9)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN10)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN13)
| (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN14)
| (GPIO_MODE_OUTPUT << GPIO_MODER_PIN15);

GPIOA->OTYPER = (1 << 3);

GPIOA->AFR[0] =
(AF_PA1_TSC_G1_IO2 << GPIO_AFR0_PIN1)
| (AF_PA2_TSC_G1_IO3 << GPIO_AFR0_PIN2)
| (AF_PA3_TSC_G1_IO4 << GPIO_AFR0_PIN3);

И наконец:
//-----------------------------------------------------------------------------
// void EXTI2_TSC_IRQHandler(void)
//-----------------------------------------------------------------------------
void EXTI2_TSC_IRQHandler(void) __attribute__((interrupt("IRQ")));
void EXTI2_TSC_IRQHandler(void)
{

int i;

static int ff = 0;
#define FF_SIZE (5)
static int point = 0;
static int delta = 0;
static int updown = 0;

if(TSC->ISR & (1 << TSC_ISR_MCEF))
{
// max
TSC->ICR = (1 << TSC_ICR_MCEIC);
//TSC_CR_START_bit = 1;
}
if(TSC->ISR & (1 << TSC_ISR_EOAF))
{
// done
TSC->ICR = (1 << TSC_ICR_EOAIC);
tsc_val = TSC->IOGXCR[0];
val[state][count] = tsc_val;

cap_sensor_data(item, tsc_val);

value[item] = tsc_val;
switch(item)
{
case 0:
pos[item] = (cap[item].val - cap[item].t_min) * 100 / (cap[item].t_max - cap[item].t_min);
break;

case 1:
pos[item] = (cap[item].val - cap[item].t_min) * 100 / (cap[item].t_max - cap[item].t_min);
break;
}

delta = delta + pos[0] + pos[1] - (delta / DELTA_N);

if(((delta / DELTA_N) - (pos[0] + pos[1])) > 20)
{
if(updown == 0)
{
//con_str("{UPDOWN=1}\n\r");
//con_start();
}
updown = 1;
}
else if(((delta / DELTA_N) - (pos[0] + pos[1])) < -20)
{
if(updown == 1)
{
//con_str("{UPDOWN=0}\n\r");
//con_start();
}
updown = 0;
}

if(updown)
{
i = (pos[0] - pos[1]) / 2;
if(i < p_min) p_min = i;
if(i > p_max) p_max = i;
}
else
{
if((p_min != 1000) && (p_max != -1000))
{
i = (p_min + p_max) / 2;

if(i < -5) v = 0;
else if(i > 5) v = 900;
else if((-5 <= p_min) && (p_max <= 5)) v = 450;

}
p_min = 1000;
p_max = -1000;
i = -1000;
}

if(i != -1000)
{
if(l == -1000) l = i;
v += (i - l) * 10;
l = i;

v += i / 5;

if(v < 0) v = 0;
else if(v > 900) v = 900;

}
else l = -1000;

fv = fv + v - (fv / F_MUL);
i = (1 << ((fv / F_MUL) / 100)) - 1;
GPIOE->BSRR = (i << 8) | (((i ^ 0xFF) << 8) << 16);
}
}

И вызываем с частотой 100Гц:

//count++;
//if(count >= 100) count = 0;

count = 27;

switch(item)
{
case 0:
item = 1;
TSC->IOCCR = (1 << TSC_G1_IO3);
break;

case 1:
default:
item = 0;
TSC->IOCCR = (1 << TSC_G1_IO2);
break;
}

TSC->CR =
((1 + (count / 10)) << TSC_CR_CTPH)
| ((1 + (count % 10)) << TSC_CR_CTPL)
| (6 << TSC_CR_MCV)
| (1 << TSC_CR_START)
| (1 << TSC_CR_TSCE);



Код в большей части отладочный, но рабочий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- silovi4   TSC (Touch sensing controller) на STM32F051   Sep 19 2013, 14:45
- - adnega   Делал сенсорные кнопки на TSC в STM32F3xx. Думаю, ...   Sep 19 2013, 15:31
- - silovi4   Можете поделиться исходным кодом?   Sep 20 2013, 06:46
- - adnega   Могу. Но вопросов будет еще больше. Библиотек не и...   Sep 20 2013, 08:39
- - silovi4   Да уж... тут без пол литра не разобраться А за...   Oct 7 2013, 09:49
|- - adnega   Цитата(silovi4 @ Oct 7 2013, 13:49) Да уж...   Oct 7 2013, 10:45
- - silovi4   Какой кварц использовали внешний или внутренний, н...   Oct 8 2013, 08:39
- - silovi4   Я так понимаю CMSIS файл вы сами доделывали?   Oct 9 2013, 08:06
|- - adnega   Цитата(silovi4 @ Oct 9 2013, 12:06) Я так...   Oct 9 2013, 09:25
|- - silovi4   Цитата(adnega @ Oct 9 2013, 12:25) Я ж го...   Oct 9 2013, 10:06
- - silovi4   Что-то я не могу запустить TSC, тактирование подаю...   Oct 9 2013, 14:05
|- - adnega   Цитата(silovi4 @ Oct 9 2013, 18:05) Что-т...   Oct 9 2013, 17:56
|- - silovi4   Цитата(adnega @ Oct 9 2013, 20:56) Попроб...   Oct 10 2013, 08:58
- - silovi4   И всё таки проблема с CooCox-ом. В Keil-е всё отли...   Oct 10 2013, 11:39
- - silovi4   Непонятно как это работает: TSC->CR = (2 <...   Oct 11 2013, 11:00
|- - adnega   Цитата(silovi4 @ Oct 11 2013, 15:00) Непо...   Oct 30 2013, 10:13
|- - silovi4   Цитата(adnega @ Oct 30 2013, 13:13) Посмо...   Oct 30 2013, 15:05
|- - adnega   Цитата(silovi4 @ Oct 30 2013, 19:05) С эт...   Oct 30 2013, 16:39
|- - silovi4   Цитата(adnega @ Oct 30 2013, 19:39) Исклю...   Nov 1 2013, 12:33
|- - adnega   Цитата(silovi4 @ Nov 1 2013, 16:33) Спаси...   Nov 1 2013, 13:52
|- - silovi4   Цитата(adnega @ Nov 1 2013, 16:52) А данн...   Nov 1 2013, 15:39
|- - silovi4   Цитата(silovi4 @ Nov 1 2013, 18:39) Вы пр...   Nov 4 2013, 08:10
|- - adnega   Цитата(silovi4 @ Nov 4 2013, 12:10) В общ...   Nov 4 2013, 08:34
|- - silovi4   Цитата(adnega @ Nov 4 2013, 11:34) Когда ...   Nov 4 2013, 11:43
|- - adnega   Цитата(silovi4 @ Nov 4 2013, 15:43) А как...   Nov 4 2013, 13:37
- - silovi4   И тишина...   Oct 30 2013, 09:45
- - silovi4   Разобрался с group 2, оказалось просто не припаял ...   Nov 4 2013, 18:31
- - adnega   Цитата(silovi4 @ Nov 4 2013, 22:31) Тепер...   Nov 4 2013, 19:48
- - silovi4   Цитата(adnega @ Nov 4 2013, 22:48) Такого...   Nov 5 2013, 12:12


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016