Hello World
发布时间 : 2023-03-01 23:31
阅读 :
chunithm/中二节奏 是什么
引用自萌娘百科
CHUNITHM(日语:チュウニズム)是由SEGA推出的街机音乐游戏,日本地区最新版本为SUN,于2022年10月13日稼动。海外地区最新版本为NEW PLUS!!,于2022年8月18日起稼动。大陆最新版本为NEW,于2022年9月5日起稼动。
软件上的配置
下载游戏本体
下载segatools
配置segatools
链接并调试手台
下载游戏本体
手台制作
自电容触摸感应模式 Self-capacitive Mode
如下图所示,这是一个典型自电容式触摸按键的PCB顶视图。该按键的形状为圆角正方形,理论上可以做成任意形状,但是为了避免尖端放电效应,达到较好的触摸效果,一般推荐边缘圆滑的形状。圆角正方形和圆形比较常见。触摸按键的大小推荐成人指尖的平均大小(直径约10mm)。如图所示,接地平面与触摸按键之间保持了一个均匀的隔离间隙,一般推荐为1mm。如果隔离间隙设置过小,则会降低触摸按键的灵敏度,而如果间隙设置过大,则削弱触摸按键的抗噪声干扰能力。
下图标示出了自电容触摸按键的截面图。在自电容触摸感应模式中,每个触摸按键需要一个MCU的TSI引脚。无手指触摸时的按键电容标记为Cp,代表寄生电容。由手指触摸所产生的额外电容被标记为ΔCp。
在自电容触摸感应模式中,MCU的TSI模块对触摸按键以一定频率进行充放电,利用等效电阻原理,把按键的电容容值大小等效成对应的平均电流,对内部的积分电容进行充电。然后通过计算充电的次数,把电容的模拟变化量转换成数字量。软件通过读取TSI模块的检测结果,进而比较预设的阈值,来判断是否有触摸事件。
自电容触摸感应方式相对比较简单,易于触摸板的布局设计,这样客户可以更自由地设计触摸按键的形状和应用触摸功能。自电容方式的典型应用领域包括通用按键,滑条和滚轮。并且得益于向所有方向发射感应磁场,自电容方式比互电容方式更适用于手势接近功能。
未写完
The MPR121 SDA line operates as both an input and an open-drain output. A pullup resistor, typically 4.7 kΩ, is required on SDA. The MPR121 SCL line operates only as an input. A pullup resistor, typically 4.7 kΩ, is required on SCL if there are multiple masters on the two-wire interface, or if the master in a single-master system has an open-drain SCL output
来自datasheet第21页
这里自己画第一版板子时完全没意识到这个问题,直接全部10kΩ伺候了(不知道效果咋样还有值得注意的一点是,MPR121的I2C地址是可变的,可以通过修改地址引脚的电平来改变,第一版板子没考虑到这,五块嫖的板子全是0x5A,此处应该用飞线或者跳线帽。
MPR121使用总结
重点在datasheet第3页和第21页,分别是典型应用电路与I2C使用范例。
STM32环境配置
MDK5.29,5.30,5.31,5.32,5.33, 5.34,5.35, 5.36, 5.37和各种pack软件包镜像下载(2022-05-04)
I2C通信原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 //IIC写函数 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); 功能:HAL库 IIC写数据 参数: *hi2c 设置使用的IIC 名称 例:&hi2c1 DevAddress 写入的地址 例 0xA0 *pData 需要写入的数据的地址 Size 要发送的字节数 Timeout 最大传输时间,超过传输时间将自动退出传输函数 //示例: HAL_I2C_Master_Transmit(&hi2c1,0xA0,(uint8_t*)tx_data,100,1000); //IIC读函数 HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); 功能:HAL库 IIC读一个字节 参数: *hi2c: 设置使用的是那个IIC 名称 例:&hi2c1 DevAddress: 读取的地址 例 0xA0 *pData: 存储读取到的数据的地址 Size: 接收的字节数 Timeout: 最大读取时间,超过时间将自动退出读取函数 //示例: HAL_I2C_Master_Receive(&hi2c1,0xA0,(uint8_t*)rx_data,100,1000); HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); 功能:HAL库 IIC写数据函数 参数: *hi2c: 设置使用的是那个IIC 名称 例:&hi2c1 DevAddress: 从机设备地址 MemAddress:从机寄存器地址 MemAddSize:从机寄存器地址长度 *pData: 存储读取到的数据的地址 Size: 接收的字节数 Timeout: 最大读取时间,超过时间将自动退出写入函数 /* 引用自[STM32 HAL库 STM32CubeMX -- I2C(IIC)](https://blog.csdn.net/Dir_x/article/details/129038897) */
写了这么多,但是大家也可以选择模拟I2C的路线。
虽说是51,但是I2C的原理是一样的。另外顺带一提,虽然MPR121带有中断功能,但是我还是选择了轮询的方式,因为我不知道怎么用中断。(妈的copilot怎么这么懂我)
键盘模拟/IO原理
俗话说“困难总比方法多”,看似非常简单的程序总是出现莫名奇妙的问题,例如cubemx生成的代码竟然直接USB设备描述符请求失败不知道啥原因,可能是驱动坏了吧
以及这个warningfunction "USBD_HID_SendReport" declared implicitly
,按理说应该是声明了的…不管他也能跑,那就不管了
注意加上这个沟吧(main.c
里面加入)
1 extern USBD_HandleTypeDef hUsbDeviceFS;
不然会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 第一列10进制键值,第二列16进制键值,第四列是按键 0 00 Reserved (no event indicated)9 N/A √ √ √ 4/101/104 1 01 Keyboard ErrorRollOver9 N/A √ √ √ 4/101/104 2 02 Keyboard POSTFail9 N/A √ √ √ 4/101/104 3 03 Keyboard ErrorUndefined9 N/A √ √ √ 4/101/104 4 04 Keyboard a and A4 31 √ √ √ 4/101/104 5 05 Keyboard b and B 50 √ √ √ 4/101/104 6 06 Keyboard c and C4 48 √ √ √ 4/101/104 7 07 Keyboard d and D 33 √ √ √ 4/101/104 8 08 Keyboard e and E 19 √ √ √ 4/101/104 9 09 Keyboard f and F 34 √ √ √ 4/101/104 10 0A Keyboard g and G 35 √ √ √ 4/101/104 11 0B Keyboard h and H 36 √ √ √ 4/101/104 12 0C Keyboard i and I 24 √ √ √ 4/101/104 13 0D Keyboard j and J 37 √ √ √ 4/101/104 14 0E Keyboard k and K 38 √ √ √ 4/101/104 15 0F Keyboard l and L 39 √ √ √ 4/101/104 16 10 Keyboard m and M4 52 √ √ √ 4/101/104 17 11 Keyboard n and N 51 √ √ √ 4/101/104 18 12 Keyboard o and O4 25 √ √ √ 4/101/104 19 13 Keyboard p and P4 26 √ √ √ 4/101/104 20 14 Keyboard q and Q4 17 √ √ √ 4/101/104 21 15 Keyboard r and R 20 √ √ √ 4/101/104 22 16 Keyboard s and S4 32 √ √ √ 4/101/104 23 17 Keyboard t and T 21 √ √ √ 4/101/104 24 18 Keyboard u and U 23 √ √ √ 4/101/104 25 19 Keyboard v and V 49 √ √ √ 4/101/104 26 1A Keyboard w and W4 18 √ √ √ 4/101/104 27 1B Keyboard x and X4 47 √ √ √ 4/101/104 28 1C Keyboard y and Y4 22 √ √ √ 4/101/104 29 1D Keyboard z and Z4 46 √ √ √ 4/101/104 30 1E Keyboard 1 and !4 2 √ √ √ 4/101/104 31 1F Keyboard 2 and @4 3 √ √ √ 4/101/104 32 20 Keyboard 3 and #4 4 √ √ √ 4/101/104 33 21 Keyboard 4 and $4 5 √ √ √ 4/101/104 34 22 Keyboard 5 and %4 6 √ √ √ 4/101/104 35 23 Keyboard 6 and ^4 7 √ √ √ 4/101/104 36 24 Keyboard 7 and &4 8 √ √ √ 4/101/104 37 25 Keyboard 8 and *4 9 √ √ √ 4/101/104 38 26 Keyboard 9 and (4 10 √ √ √ 4/101/104 39 27 Keyboard 0 and )4 11 √ √ √ 4/101/104 40 28 Keyboard Return (ENTER)5 43 √ √ √ 4/101/104 41 29 Keyboard ESCAPE 110 √ √ √ 4/101/104 42 2A Keyboard DELETE (Backspace)13 15 √ √ √ 4/101/104 43 2B Keyboard Tab 16 √ √ √ 4/101/104 44 2C Keyboard Spacebar 61 √ √ √ 4/101/104 45 2D Keyboard - and (underscore)4 12 √ √ √ 4/101/104 46 2E Keyboard = and +4 13 √ √ √ 4/101/104 47 2F Keyboard [ and {4 27 √ √ √ 4/101/104 48 30 Keyboard ] and }4 28 √ √ √ 4/101/104 49 31 Keyboard \ and | 29 √ √ √ 4/101/104 50 32 Keyboard Non-US # and ~2 42 √ √ √ 4/101/104 51 33 Keyboard ; and :4 40 √ √ √ 4/101/104 52 34 Keyboard ‘ and “4 41 √ √ √ 4/101/104 53 35 Keyboard Grave Accent and Tilde4 1 √ √ √ 4/101/104 54 36 Keyboard, and <4 53 √ √ √ 4/101/104 55 37 Keyboard . and >4 54 √ √ √ 4/101/104 56 38 Keyboard / and ?4 55 √ √ √ 4/101/104 57 39 Keyboard Caps Lock11 30 √ √ √ 4/101/104 58 3A Keyboard F1 112 √ √ √ 4/101/104 59 3B Keyboard F2 113 √ √ √ 4/101/104 60 3C Keyboard F3 114 √ √ √ 4/101/104 61 3D Keyboard F4 115 √ √ √ 4/101/104 62 3E Keyboard F5 116 √ √ √ 4/101/104 63 3F Keyboard F6 117 √ √ √ 4/101/104 64 40 Keyboard F7 118 √ √ √ 4/101/104 65 41 Keyboard F8 119 √ √ √ 4/101/104 66 42 Keyboard F9 120 √ √ √ 4/101/104 67 43 Keyboard F10 121 √ √ √ 4/101/104 68 44 Keyboard F11 122 √ √ √ 101/104 69 45 Keyboard F12 123 √ √ √ 101/104 70 46 Keyboard PrintScreen1 124 √ √ √ 101/104 71 47 Keyboard Scroll Lock11 125 √ √ √ 4/101/104 72 48 Keyboard Pause1 126 √ √ √ 101/104 73 49 Keyboard Insert1 75 √ √ √ 101/104 74 4A Keyboard Home1 80 √ √ √ 101/104 75 4B Keyboard PageUp1 85 √ √ √ 101/104 76 4C Keyboard Delete Forward1;14 76 √ √ √ 101/104 77 4D Keyboard End1 81 √ √ √ 101/104 78 4E Keyboard PageDown1 86 √ √ √ 101/104 79 4F Keyboard RightArrow1 89 √ √ √ 101/104 80 50 Keyboard LeftArrow1 79 √ √ √ 101/104 81 51 Keyboard DownArrow1 84 √ √ √ 101/104 82 52 Keyboard UpArrow1 83 √ √ √ 101/104 83 53 Keypad Num Lock and Clear11 90 √ √ √ 101/104 84 54 Keypad /1 95 √ √ √ 101/104 85 55 Keypad * 100 √ √ √ 4/101/104 86 56 Keypad - 105 √ √ √ 4/101/104 87 57 Keypad + 106 √ √ √ 4/101/104 88 58 Keypad ENTER5 108 √ √ √ 101/104 89 59 Keypad 1 and End 93 √ √ √ 4/101/104 90 5A Keypad 2 and Down Arrow 98 √ √ √ 4/101/104 91 5B Keypad 3 and PageDn 103 √ √ √ 4/101/104 92 5C Keypad 4 and Left Arrow 92 √ √ √ 4/101/104 93 5D Keypad 5 97 √ √ √ 4/101/104 94 5E Keypad 6 and Right Arrow 102 √ √ √ 4/101/104 95 5F Keypad 7 and Home 91 √ √ √ 4/101/104 96 60 Keypad 8 and Up Arrow 96 √ √ √ 4/101/104 97 61 Keypad 9 and PageUp 101 √ √ √ 4/101/104 98 62 Keypad 0 and Insert 99 √ √ √ 4/101/104 99 63 Keypad . and Delete 104 √ √ √ 4/101/104 100 64 Keyboard Non-US \ and |3;6 45 √ √ √ 4/101/104 101 65 Keyboard Application10 129 √ √ 104 102 66 Keyboard Power9 √ √ 103 67 Keypad = √ 104 68 Keyboard F13 √ 105 69 Keyboard F14 √ 106 6A Keyboard F15 √ 107 6B Keyboard F16 108 6C Keyboard F17 109 6D Keyboard F18 110 6E Keyboard F19 111 6F Keyboard F20 112 70 Keyboard F21 113 71 Keyboard F22 114 72 Keyboard F23 115 73 Keyboard F24 116 74 Keyboard Execute √ 117 75 Keyboard Help √ 118 76 Keyboard Menu √ 119 77 Keyboard Select √ 120 78 Keyboard Stop √ 121 79 Keyboard Again √ 122 7A Keyboard Undo √ 123 7B Keyboard Cut √ 124 7C Keyboard Copy √ 125 7D Keyboard Paste √ 126 7E Keyboard Find √ 127 7F Keyboard Mute √ 128 80 Keyboard Volume Up √ 129 81 Keyboard Volume Down √ 130 82 Keyboard Locking Caps Lock12 √ 131 83 Keyboard Locking Num Lock12 √ 132 84 Keyboard Locking Scroll Lock12 √ 133 85 Keypad Comma27 107 134 86 Keypad Equal Sign29 135 87 Keyboard International115,28 56 136 88 Keyboard International216 137 89 Keyboard International317 138 8A Keyboard International418 139 8B Keyboard International519 140 8C Keyboard International620 141 8D Keyboard International721 142 8E Keyboard International822 143 8F Keyboard International922 144 90 Keyboard LANG125 145 91 Keyboard LANG226 146 92 Keyboard LANG330 147 93 Keyboard LANG431 148 94 Keyboard LANG532 149 95 Keyboard LANG68 150 96 Keyboard LANG78 151 97 Keyboard LANG88 152 98 Keyboard LANG98 153 99 Keyboard Alternate Erase7 154 9A Keyboard SysReq/Attention1 155 9B Keyboard Cancel 156 9C Keyboard Clear 157 9D Keyboard Prior 158 9E Keyboard Return 159 9F Keyboard Separator 160 A0 Keyboard Out 161 A1 Keyboard Oper 162 A2 Keyboard Clear/Again 163 A3 Keyboard CrSel/Props 164 A4 Keyboard ExSel 165-175 A5-CF Reserved 176 B0 Keypad 00 177 B1 Keypad 000 178 B2 Thousands Separator 33 179 B3 Decimal Separator 33 180 B4 Currency Unit 34 181 B5 Currency Sub-unit 34 182 B6 Keypad ( 183 B7 Keypad ) 184 B8 Keypad { 185 B9 Keypad } 186 BA Keypad Tab 187 BB Keypad Backspace 188 BC Keypad A 189 BD Keypad B 190 BE Keypad C 191 BF Keypad D 192 C0 Keypad E 193 C1 Keypad F 194 C2 Keypad XOR 195 C3 Keypad ^ 196 C4 Keypad % 197 C5 Keypad < 198 C6 Keypad > 199 C7 Keypad & 200 C8 Keypad && 201 C9 Keypad | 202 CA Keypad || 203 CB Keypad : 204 CC Keypad # 205 CD Keypad Space 206 CE Keypad @ 207 CF Keypad ! 208 D0 Keypad Memory Store 209 D1 Keypad Memory Recall 210 D2 Keypad Memory Clear 211 D3 Keypad Memory Add 212 D4 Keypad Memory Subtract 213 D5 Keypad Memory Multiply 214 D6 Keypad Memory Divide 215 D7 Keypad +/- 216 D8 Keypad Clear 217 D9 Keypad Clear Entry 218 DA Keypad Binary 219 DB Keypad Octal 220 DC Keypad Decimal 221 DD Keypad Hexadecimal 222-223 DE-DF Reserved 224 E0 Keyboard LeftControl 58 √ √ √ 4/101/104 225 E1 Keyboard LeftShift 44 √ √ √ 4/101/104 226 E2 Keyboard LeftAlt 60 √ √ √ 4/101/104 227 E3 Keyboard Left GUI10;23 127 √ √ √ 104 228 E4 Keyboard RightControl 64 √ √ √ 101/104 229 E5 Keyboard RightShift 57 √ √ √ 4/101/104 230 E6 Keyboard RightAlt 62 √ √ √ 101/104 231 E7 Keyboard Right GUI10;24 128 √ √ √ 104 232-65535 E8-FFFF Reserved
用HAL库实现I2C接收功能的main.c如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 #include "main.h" #include "stm32f1xx_hal.h" #include "i2c.h" #include "usart.h" #include "gpio.h" void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_I2C1_Init(); while (1) { uint8_t tx_data[100] = {0}; uint8_t rx_data[100] = {0}; tx_data[0] = 0x5A; HAL_I2C_Master_Transmit(&hi2c1,0xA0,(uint8_t*)tx_data,100,1000); HAL_I2C_Master_Receive(&hi2c1,0xA0,(uint8_t*)rx_data,100,1000); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } }
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 17398100393@qq.com